ruby on rails——是否有办法绕过大规模分配保护?



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

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

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

问题是,这样做涉及到大规模赋值,这是不允许的(我被告知有充分的理由!)对于我没有赋予attr_writer能力的属性。

是否有一种方法可以绕过只针对此操作的质量赋值保护?

assign_attributes with 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)

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

有点像一个hack,但是…

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

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

您也可以通过这种方式创建用户,而不是进行批量分配。

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

你可能想把它放到一个方法中。

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

相关内容

  • 没有找到相关文章

最新更新