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

Ruby on rails 有没有办法绕过质量分配保护?,ruby-on-rails,ruby,ruby-on-rails-3,mass-assignment,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 问题是,这样做涉及到批量分配,对于我没有赋予属性编写器能力的属性,这是不允许的(有充分的理由告诉我!) 是否有一种方法可以仅针对此操作绕过质量分配保护?

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

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

def decode(json)
  self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end
问题是,这样做涉及到批量分配,对于我没有赋予属性编写器能力的属性,这是不允许的(有充分的理由告诉我!)

是否有一种方法可以仅针对此操作绕过质量分配保护?

编辑:答案是一个更好的解决方案

有点像黑客,但是

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

这将为guard\u protected\u attributes参数调用attributes=passing false,该参数将跳过任何批量分配检查。

assign\u attributes
with
with
without\u protection:true
似乎不那么麻烦:

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }, :without_protection => true)
user.name       # => "Josh"
user.is_admin?  # => true
@对于评论中提到的Vodeverett,您也可以将其与
new
一起使用,如1行中所示

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

也可以通过这种方式创建不进行体量指定的用户

User.create do |user|
  user.name = "Josh"
end
您可能希望将其放入一个方法中

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

谢谢,这很有效。我不得不修正两个小的打字错误,“self”后面的点和self.name.downcase的大括号。这应该是答案,依我看!此外,在对
new
(即
user=user.new({name:'Josh',is_admin:true},unnot_protection:true)
的初始调用中,似乎可以通过
而不受保护:true)
在直接传递到
create
操作:
user.create({name:'Josh',is_admin:true},不受保护:true)时也可以工作