我有一个关于在Rails中使用attr_accessible
的问题。
我有时希望将guard_protected_attributes
设置为false
以绕过群发分配保护。我想知道为什么以下行不起作用(它创建“无法字符串化键”错误):
@user.attributes=({ :name => "James Bond", :admin => true }, false)
......但这样做:
@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)
有人知道原因吗?
答案 0 :(得分:6)
因为Ruby解析器将“{ :name => "James Bond", :admin => true}, false
”解析为#attributes=
的单个参数。调用方法“foo=
”将您限制为Ruby中的一个参数。 send
可以解决这个问题。
实际上发生的事情是Rails正试图对false
的密钥进行字符串化,而FalseClass
而不是Hash
的密钥没有任何密钥。
答案 1 :(得分:1)
我想看看你们是否会跟进这个,所以我必须使用.send或者是否有更好的方法?
答案 2 :(得分:1)
我最后定义了一些辅助方法,以便更轻松地绕过质量分配限制。
module ActiveRecord
class Base
# Assigns attributes while ignoring mass assignment protection
def force_feed(attributes)
self.send(:attributes=, attributes, false)
self
end
end
end
答案 3 :(得分:1)
在ActiveRecord的更高版本中,取出了= =的第二个参数。您现在可以调用相同的效果:
model.assign_attributes(attributes, :without_protection => true)