浅谈Rails 4 中Strong Parameters机制
- 作者: 您的用户名未注册
- 来源: 51数据库
- 2021-08-10
要弄明白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 。
推荐阅读
