我想开始在我的模型中使用attr_accessible来解决质量分配问题.我理解它是如何工作的,并尽可能多地进行研究.
我不明白的是使用update_attributes(params [:my_form])或create(params [:my_form])和逐个设置字段之间的区别?这两个都不是那么脆弱吗?
没有attr_accessible和这样做有什么区别…
@model_object = ModelObject.new @model_object.create(params[:model_object_params])
并且有attr_accessible并且这样做……
@model_object = ModelObject.new @model_object.field1 = params[:model_object_params][:field1] @model_object.field2 = params[:model_object_params][:field2] @model_object.field3 = params[:model_object_params][:field3] @model_object.save!
这些创建记录的方法都不是那么脆弱吗?黑客/黑客可以发送这两种方法的网址,两者都会做同样的,对吧?
或者使用attr_accessible并逐个更新字段做不同的事情或以某种方式变得更安全?
我发现使用attr_accessible的所有这些方法对我来说没有任何意义.它似乎以两种不同的方式做同样的事情.我错过了什么?
谢谢.
解决方法
在你这样做的方式,它不会阻止“质量分配”.
“质量分配”是Rails处理为模型中的属性赋值的过程中使用的术语.这通常在控制器中完成,使用参数中的名称和值.
当你自己进行分配时,它在某种程度上也是“大规模分配”;但在这种情况下,你可以很好地控制要分配的内容和不分配的内容.因此,为了节省编写样板分配代码,Rails提供了attr_accesible – 相同的控制,更少的代码.
要了解它的使用方法:
假设ActivityLog模型具有名为user_ip_address的属性.
现在,user_ip_address是模型中的一个属性,可以通过质量赋值或“自动滚动质量分配”来分配.
但在两种情况下都是错误的 – 您不希望用户提供的输入为该属性设置值.
相反,您希望始终找出用户的实际IP地址并分配该值(忽略任何值)
参数中的值).因此,您可以从attr_accessible中排除user_ip_address,而是自己分配.
attr_accessible :all_attributes_except_user_ip_address @al = ActivityLog.new(params[:model_object_params]) @al.user_ip_address = get_origin_user_ip_address @al.save
对于用户无法更改的任何信息,请使用attr_accessible并将其从列表中排除.