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 的质量分配

使用 Rails 3.1 :as => :admin 更新受 attr_accessible 保护的属性

Rails 3.2,批量分配,动态角色?