Rails - attr_accessible&大规模任务

时间:2009-06-04 16:58:56

标签: ruby-on-rails ruby mass-assignment

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

我有时希望将guard_protected_attributes设置为false以绕过群发分配保护。我想知道为什么以下行不起作用(它创建“无法字符串化键”错误):

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

......但这样做:

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

有人知道原因吗?

4 个答案:

答案 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)