3

我有一个关于attr_accessible在 Rails 中使用的问题。

我有时想设置guard_protected_attributesfalse以绕过批量分配保护。我想知道为什么以下行不起作用(它会产生“无法字符串化键”错误):

@user.attributes=({ :name => "James Bond", :admin => true }, false)

...但这确实:

@user.send(:attributes=, { :name => "James Bond", :admin => true }, false)

有人知道原因吗?

4

4 回答 4

6

因为Ruby解析器将 ' '{ :name => "James Bond", :admin => true}, false作为. 调用方法 ' ' 将您限制为 Ruby 中的一个参数。解决这个问题。#attributes=foo=send

实际发生的情况是 Rails 正在尝试对 的键进行字符串化,这些键false是 aFalseClass而不是 a Hash,没有任何键。

于 2009-06-04T17:04:34.460 回答
1

我想看看你们是否会跟进这个,所以我必须使用 .send 或者是否有更好的方法?

于 2009-08-31T08:12:05.540 回答
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
于 2011-01-07T18:36:25.467 回答
1

在更高版本的 ActiveRecord 中,attributes= 的第二个参数被去掉了。您现在可以使用相同的效果调用:

model.assign_attributes(attributes, :without_protection => true)
于 2012-05-03T16:47:31.467 回答