Rails - attr_accessible & 集体分配

发布于 2024-07-23 08:44:59 字数 427 浏览 3 评论 0原文

我有一个关于在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

枉心 2024-07-30 08:44:59

因为 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. The send gets around that.

What's actually happening is that Rails is trying to stringify the keys of false, which, being a FalseClass rather than a Hash, doesn't have any.

她如夕阳 2024-07-30 08:44:59

我想看看你们是否会跟进这个问题,所以我必须使用 .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?

小…楫夜泊 2024-07-30 08:44:59

我最终只是定义了一些辅助方法,以便更容易地绕过批量分配限制。

module ActiveRecord
  class Base

    # Assigns attributes while ignoring mass assignment protection
    def force_feed(attributes)
      self.send(:attributes=, attributes, false)
      self
    end

  end
end

I wound up just defining some helper methods to make bypassing the mass assignment restrictions a bit easier.

module ActiveRecord
  class Base

    # Assigns attributes while ignoring mass assignment protection
    def force_feed(attributes)
      self.send(:attributes=, attributes, false)
      self
    end

  end
end
森罗 2024-07-30 08:44:59

在 ActiveRecord 的更高版本中,attributes= 的第二个参数被删除。 您现在可以调用以获得相同的效果:

model.assign_attributes(attributes, :without_protection => true)

In later versions of ActiveRecord the second parameter to attributes= was taken out. You can now call with the same effect:

model.assign_attributes(attributes, :without_protection => true)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文