浅谈Rails 4 中Strong Parameters机制
程序员文章站
2022-04-09 14:11:31
要弄明白rails 4 中strong parameters机制,首先我们要看看rails3中的parameters
在 rails3 中创建或更新 active rec...
要弄明白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 。