欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈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?

 浅谈Rails 4 中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 。