要弄明白R(shí)ails 4 中Strong Parameters機(jī)制,首先我們要看看Rails3中的Parameters
在 Rails3 中創(chuàng)建或更新 Active Record 對(duì)象時(shí),會(huì)有 Mass Assignment 安全問(wèn)題。所以 Model 中需要列一個(gè)白名單,聲明哪些屬性可以被 parameter 的數(shù)據(jù)更新。
Rails 3
# kings_controller.rbdef create #{ name: ‘David', sex:male, age: 31} @king = King.new(params[:king]) if @king.save redirect_to @king else render 'new' endend# king.rbclass King attr_accessible :nameend
Rails 4
Rails 4 引入了 Strong Parameters 的機(jī)制,Model 不再負(fù)責(zé)白名單的維護(hù),把過(guò)濾非法屬性的職責(zé)推給了 Controller。
# kings_controller.rbdef create # new parameter { name: ‘David' } @king = King.new(king_params) if @king.save redirect_to @king else render 'new' endendprivatedef king_params # old parameter { name: ‘David', sex:male, age: 31} # new parameter { name: ‘David' } params[:king].permit(:name)end# king.rbclass Kingend
什么是 Strong Parameters?
說(shuō)白了 Strong Parameter 其是就是一層白名單過(guò)濾。
View 層穿過(guò)來(lái)的數(shù)據(jù)會(huì)轉(zhuǎn)化為一個(gè) ActionController::Parameters 對(duì)象
過(guò)濾老的 ActionController::Parameters 對(duì)象,生成一個(gè)新的 ActionController::Parameters 對(duì)象。
* 只保留白名單屬性
* 實(shí)例變量 @permitted 賦為 true
把過(guò)濾后的 ActionController::Parameters 對(duì)象傳給 model,創(chuàng)建或更新對(duì)應(yīng)的的 ActiveRecord 對(duì)象。
可以硬傳給 model,霸王硬上弓嗎?
未經(jīng) Strong Parameter 過(guò)濾的 ActionController::Parameters 對(duì)象的 @permitted 為 false(過(guò)濾后為 true)。如果硬傳給 Model,會(huì)報(bào)錯(cuò) ActiveModel::ForbiddenAttributesError 。
新聞熱點(diǎn)
疑難解答
圖片精選