有没有办法绕过质量分配保护?

时间:2011-04-14 07:17:18

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

我有一个Rails 3应用程序,JSON对对象进行编码,以便将它们存储在Redis键/值存储区中。

当我检索对象时,我正在尝试解码JSON并从数据中实例化它们,如下所示:

def decode(json)
  self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end

问题在于这样做涉及大量分配,这是因为我没有给予attr_writer能力的属性而被禁止(有充分理由我被告知!)。

有没有办法可以绕过仅用于此操作的质量分配保护?

3 个答案:

答案 0 :(得分:85)

带有assign_attributes

without_protection: true似乎不那么具有侵入性:

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }, :without_protection => true)
user.name       # => "Josh"
user.is_admin?  # => true

@tovodeverett在评论中提到你也可以用它new,就像在1行中一样

user = User.new({ :name => 'Josh', :is_admin => true }, :without_protection => true)

答案 1 :(得分:6)

编辑: kizzx2's答案是一个更好的解决方案。

有点黑客,但是......

self.new do |n|
  n.send "attributes=", JSON.decode( json )["#{self.name.downcase}"], false
end

这将为guard_protected_attributes参数调用attributes =传递false,这将跳过任何批量分配检查。

答案 2 :(得分:4)

您也可以通过这种方式创建一个没有进行质量分配的用户。

User.create do |user|
  user.name = "Josh"
end

您可能希望将其放入方法中。

new_user(name)
  User.create do |user|
    user.name = name
  end
end