要弄明白Rails 4 中Strong Parameters機制,首先我們要看看Rails3中的Parameters
在 Rails3 中創建或更新 Active Record 對象時,會有 Mass Assignment 安全問題。所以 Model 中需要列一個白名單,聲明哪些屬性可以被 parameter 的數據更新。
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 的機制,Model 不再負責白名單的維護,把過濾非法屬性的職責推給了 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 層穿過來的數據會轉化為一個 ActionController::Parameters 對象
過濾老的 ActionController::Parameters 對象,生成一個新的 ActionController::Parameters 對象。
* 只保留白名單屬性
* 實例變量 @permitted 賦為 true
把過濾后的 ActionController::Parameters 對象傳給 model,創建或更新對應的的 ActiveRecord 對象。
可以硬傳給 model,霸王硬上弓嗎?
未經 Strong Parameter 過濾的 ActionController::Parameters 對象的 @permitted 為 false(過濾后為 true)。如果硬傳給 Model,會報錯 ActiveModel::ForbiddenAttributesError 。
您可能感興趣的文章:- MyBatis3傳遞多個參數(Multiple Parameters)
- Pytorch之parameters的使用
- Struts2源碼分析之ParametersInterceptor攔截器
- ECMAScript6函數剩余參數(Rest Parameters)
- PowerShell函數中使用$PSBoundParameters獲取輸入參數列表實例
- PDO版本問題 Invalid parameter number: no parameters were bound
- asp.net Parameters.AddWithValue方法在SQL語句的 Where 字句中的用法
- 基于parameters參數實現參數化過程解析