2

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

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

4 回答 4

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
于 2010-09-28T02:50:58.650 回答
2

我今晚真的只是写了一个 gem 来处理这个确切的问题。我计划在本周晚些时候将它添加到 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()如果要保存实例,也可以使用

于 2010-09-28T04:01:16.077 回答
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})

您可能还需要考虑角色

User.new(params, as: :admin)
于 2013-07-23T00:25:02.913 回答
0

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

例子:

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

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

于 2010-11-04T07:54:46.107 回答