当前位置: 移动技术网 > IT编程>脚本编程>Ruby > 浅谈Rails 4 中Strong Parameters机制

浅谈Rails 4 中Strong Parameters机制

2017年12月08日  | 移动技术网IT编程  | 我要评论
要弄明白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 。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网