我的用户模型中有以下代码:
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以使此代码正常工作并为电子邮件分配值?
谢谢。
答案 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,但你可以先创建对象然后调用相同的方法并保存,我猜不会太痛苦。