Rails - attr_accessible & mass assignment
Posted
技术标签:
【中文标题】Rails - attr_accessible & mass assignment【英文标题】: 【发布时间】:2010-10-31 09:51:30 【问题描述】:我有一个关于在 Rails 中使用 attr_accessible
的问题。
我有时想将guard_protected_attributes
设置为false
以绕过批量分配保护。我想知道为什么以下行不起作用(它会产生“无法字符串化键”错误):
@user.attributes=( :name => "James Bond", :admin => true , false)
...但确实如此:
@user.send(:attributes=, :name => "James Bond", :admin => true , false)
有人知道原因吗?
【问题讨论】:
【参考方案1】:因为 Ruby 解析器将 ' :name => "James Bond", :admin => true, false
' 解析为 #attributes=
的 single 参数。调用方法 'foo=
' 将您限制为 Ruby 中的一个参数。 send
解决了这个问题。
实际发生的情况是 Rails 正在尝试对 false
的键进行字符串化,而 FalseClass
而不是 Hash
,没有任何键。
【讨论】:
谢谢,这让我快疯了! 我实际上在 IRB 中进行了一些测试。单个参数是一个数组,它也不能字符串化它的键。 我只想看到一个数组将其键字符串化。 好的,戴夫:Array.class_eval def stringify_keys;结果 = ; each_with_index |x,i| reuslt["#i"] = x ;结果 。但我个人没有用它:)【参考方案2】:我想看看你们是否会跟进这个,所以我必须使用 .send 或者是否有更好的方法?
【讨论】:
【参考方案3】:我最后只是定义了一些辅助方法,以便更容易绕过批量分配限制。
module ActiveRecord
class Base
# Assigns attributes while ignoring mass assignment protection
def force_feed(attributes)
self.send(:attributes=, attributes, false)
self
end
end
end
【讨论】:
【参考方案4】:在更高版本的 ActiveRecord 中,attributes= 的第二个参数被去掉了。您现在可以调用相同的效果:
model.assign_attributes(attributes, :without_protection => true)
【讨论】:
以上是关于Rails - attr_accessible & mass assignment的主要内容,如果未能解决你的问题,请参考以下文章
用于 attr_accessible/protected 的 Rails 3 配置设置
Rails - attr_accessible & mass assignment
Rails 批量赋值定义和 attr_accessible 使用
在模型 Rails 3.2.2 中没有设置 attr_accessible 的质量分配