2010-09-28 75 views
2

我在我的用戶模型下面的代碼:Ruby on Rails的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讓這段代碼工作並給電子郵件賦值?

謝謝。

回答

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

老了,但仍然應該標明正確的答案。 – 2014-03-17 04:09:43

2

我真的只是寫了一個寶石今晚來處理這個確切的問題。我打算在本週晚些時候將它添加到RubyGems.org之後,我將介紹它。在此期間可以隨時查看代碼。 http://github.com/beerlington/sudo_attributes

使用的寶石,你的代碼將變爲:

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()如果要保存實例

+0

我喜歡這個想法:D – PeterWong 2010-09-28 04:05:34

+0

DIGG THIS!應該是核心內的某個地方! – 2010-11-04 07:26:28

+0

對不起...不錯...但我認識到更合理的做法,使用self.send(:attributes =,hash,false) – 2010-11-04 07:51:33

0

保護的核心是對self.attributes =,如果使用self.send,您可以在名爲guard_protected_attributes的末尾觸發一個特殊的隱藏參數爲false。

例子:

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

這將完全跳過保護功能。它不適用於新的,但你可以簡單地創建對象,然後調用相同的方法並保存,我猜不是太痛苦。

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)