Ruby on Rails attr_protected

时间:2010-09-28 02:50:00

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

我的用户模型中有以下代码:

attr_protected :email

我正在尝试创建一个新的用户对象,但是我使用以下代码获得了一个质量分配保护错误。

user = User.new(
    :first_name => signup.first_name,
    :last_name => signup.last_name,
    :email => signup.email,
    :birthday => signup.birthday,
    :encrypted_password => signup.encrypted_password,
    :salt => signup.salt
  )

是否有人知道如何解决attr_protected以使此代码正常工作并为电子邮件分配值?

谢谢。

4 个答案:

答案 0 :(得分:11)

user = User.new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)
user.email = signup.email

答案 1 :(得分:2)

我真的只是今晚写了一个宝石来处理这个问题。我打算在本周晚些时候对它进行演示之后将它添加到RubyGems.org。请随时查看代码。 http://github.com/beerlington/sudo_attributes

使用gem,您的代码将更改为:

user = User.sudo_new(
  :first_name => signup.first_name,
  :last_name => signup.last_name,
  :email => signup.email,
  :birthday => signup.birthday,
  :encrypted_password => signup.encrypted_password,
  :salt => signup.salt
)

如果要保存实例

,也可以使用sudo_create()

答案 2 :(得分:1)

update_attributes现在允许您覆盖保护,如果您知道哈希是安全的,比如内部使用,其中您设置的字段不是来自用户可控制的哈希。

user = User.new({
  first_name: signup.first_name,
  last_name: signup.last_name,
  email: signup.email,
  birthday: signup.birthday,
  encrypted_password: signup.encrypted_password,
  salt: signup.salt
}, {without_protection: true})

您可能还想考虑roles

User.new(params, as: :admin)

答案 3 :(得分:0)

保护的核心是self.attributes =,如果你使用self.send,你可以在最后触发一个名为guard_protected_attributes的特殊隐藏参数为假。

示例:

self.send(:attributes=, hash, false)

这将完全跳过保护功能。它不适用于new,但你可以先创建对象然后调用相同的方法并保存,我猜不会太痛苦。