淺談Rails 4 中Strong Parameters機(jī)制
要弄明白R(shí)ails 4 中Strong Parameters機(jī)制,首先我們要看看Rails3中的Parameters
在 Rails3 中創(chuàng)建或更新 Active Record 對(duì)象時(shí),會(huì)有 Mass Assignment 安全問題。所以 Model 中需要列一個(gè)白名單,聲明哪些屬性可以被 parameter 的數(shù)據(jù)更新。
Rails 3
# kings_controller.rb
def create
#{ name: ‘David', sex:male, age: 31}
@king = King.new(params[:king])
if @king.save
redirect_to @king
else
render 'new'
end
end
# king.rb
class King
attr_accessible :name
end
Rails 4
Rails 4 引入了 Strong Parameters 的機(jī)制,Model 不再負(fù)責(zé)白名單的維護(hù),把過濾非法屬性的職責(zé)推給了 Controller。
# kings_controller.rb
def create
# new parameter { name: ‘David' }
@king = King.new(king_params)
if @king.save
redirect_to @king
else
render 'new'
end
end
private
def king_params
# old parameter { name: ‘David', sex:male, age: 31}
# new parameter { name: ‘David' }
params[:king].permit(:name)
end
# king.rb
class King
end
什么是 Strong Parameters?

說白了 Strong Parameter 其是就是一層白名單過濾。
View 層穿過來的數(shù)據(jù)會(huì)轉(zhuǎn)化為一個(gè) ActionController::Parameters 對(duì)象
過濾老的 ActionController::Parameters 對(duì)象,生成一個(gè)新的 ActionController::Parameters 對(duì)象。
* 只保留白名單屬性
* 實(shí)例變量 @permitted 賦為 true
把過濾后的 ActionController::Parameters 對(duì)象傳給 model,創(chuàng)建或更新對(duì)應(yīng)的的 ActiveRecord 對(duì)象。
可以硬傳給 model,霸王硬上弓嗎?
未經(jīng) Strong Parameter 過濾的 ActionController::Parameters 對(duì)象的 @permitted 為 false(過濾后為 true)。如果硬傳給 Model,會(huì)報(bào)錯(cuò) ActiveModel::ForbiddenAttributesError 。
- MyBatis3傳遞多個(gè)參數(shù)(Multiple Parameters)
- Pytorch之parameters的使用
- Struts2源碼分析之ParametersInterceptor攔截器
- ECMAScript6函數(shù)剩余參數(shù)(Rest Parameters)
- PowerShell函數(shù)中使用$PSBoundParameters獲取輸入?yún)?shù)列表實(shí)例
- PDO版本問題 Invalid parameter number: no parameters were bound
- asp.net Parameters.AddWithValue方法在SQL語(yǔ)句的 Where 字句中的用法
- 基于parameters參數(shù)實(shí)現(xiàn)參數(shù)化過程解析
相關(guān)文章
學(xué)習(xí)Ruby你需要了解的相關(guān)知識(shí)(rvm, gem, bundle, rake, rails等)
這篇文章主要介紹了學(xué)習(xí)Ruby你需要了解的相關(guān)知識(shí)(rvm, gem, bundle, rake, rails等),需要的朋友可以參考下2014-06-06
Ruby實(shí)現(xiàn)二分搜索(二分查找)算法的簡(jiǎn)單示例
二分查找是一種在已經(jīng)過排序的數(shù)組中搜索指定元素用的算法,這里我們就來看一下Ruby實(shí)現(xiàn)二分搜索(二分查找)算法的簡(jiǎn)單示例:2016-07-07
使用Ruby編寫發(fā)送郵件的程序的簡(jiǎn)單教程
這篇文章主要介紹了使用Ruby編寫發(fā)送郵件的程序的簡(jiǎn)單教程,包括發(fā)送帶附件的郵件的代碼實(shí)例,需要的朋友可以參考下2015-04-04
Ruby中訪問SQL Server數(shù)據(jù)庫(kù)的配置實(shí)例
這篇文章主要介紹了Ruby中訪問SQL Server數(shù)據(jù)庫(kù)的配置實(shí)例,本文通過FreeTDS實(shí)現(xiàn),同時(shí)介紹了在ActiveRecord上使用Tiny_TDS的技巧,需要的朋友可以參考下2014-11-11
簡(jiǎn)單談?wù)凴uby的private和protected
Ruby類下對(duì)訪問控制的限制也是用public,protected和private來做的。雖然用的是和C++和Java相同的名字,但是Ruby下的protected和private定義還是有所不同的。2016-02-02

