Rails - attr_accessible & 集体分配
我有一个关于在 Rails 中使用 attr_accessible
的问题。
我有时想将 guard_protected_attributes
设置为 false
以绕过批量分配保护。 我想知道为什么以下行不起作用(它会创建“无法字符串化键”错误):
@user.attributes=({ :name => "James Bond", :admin => true }, false)
...但这确实有效:
@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)
有人知道原因吗?
I have a question about using attr_accessible
in Rails.
I sometimes want to set guard_protected_attributes
to false
in order to bypass mass assignment protection. I'm wondering why the following line doesn't work (it creates the "can't stringify keys" error):
@user.attributes=({ :name => "James Bond", :admin => true }, false)
...but this does:
@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)
Anyone know the reason?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
因为 Ruby 解析器解析 '
{ :name =>; “詹姆斯·邦德”,:admin => true}, false
' 作为#attributes=
的单个参数。 在 Ruby 中调用方法“foo=
”会将您限制为一个参数。send
解决了这个问题。实际发生的情况是,Rails 正在尝试对
false
的键进行字符串化,该键是FalseClass
而不是Hash
,因此没有任何。Because the Ruby parser parses '
{ :name => "James Bond", :admin => true}, false
' as the single argument to#attributes=
. Calling a method 'foo=
' limits you to one argument in Ruby. Thesend
gets around that.What's actually happening is that Rails is trying to stringify the keys of
false
, which, being aFalseClass
rather than aHash
, doesn't have any.我想看看你们是否会跟进这个问题,所以我必须使用 .send 或者是否有更好的方法?
I want to see if you guys would follow up this, so I have to use .send or if there is a better approach?
我最终只是定义了一些辅助方法,以便更容易地绕过批量分配限制。
I wound up just defining some helper methods to make bypassing the mass assignment restrictions a bit easier.
在 ActiveRecord 的更高版本中,attributes= 的第二个参数被删除。 您现在可以调用以获得相同的效果:
In later versions of ActiveRecord the second parameter to attributes= was taken out. You can now call with the same effect: