2013-05-15 29 views
2

所以,我有一些簡單的用戶模型,並更新密碼的窗體。Rails在更新對象時驗證唯一性? - 非常奇怪

@user.update_attributes(:password=>params[:password]) 

但這並沒有工作,我想通了:

User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'z7KU4I0IXLjiRMpdF6SOVQ' LIMIT 1 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."password_reset_token" = 'aMOjTN0ikPUOJo2JMVoDtQ' LIMIT 1 
    (0.0ms) BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
    (0.0ms) ROLLBACK 
Redirected to http://localhost:3000/edit_user_by_reset?reset_token=aMOjTN0ikPUOJo2JMVoDtQ 

通過第三選擇我可以告訴大家,這裏是唯一性驗證失敗!這就是ROLLBACK的原因。 但它沒有任何意義,當然DB中有這樣的行,因爲它是UPDATE操作。我該怎麼辦?我不想在這裏通過:validate=>false

+0

至少有兩個用戶具有相同的電子郵件地址,其中一個id = 1,另一個沒有。 –

+0

重新閱讀的問題,很顯然有這樣的用戶,因爲它是UPDATE動作,它更新現有行的一些列 –

+2

我斷言User.find(1).valid?將返回false。你認爲「顯而易見」是不正確的。該查詢正在查找具有相同電子郵件的* other *用戶(即具有不同ID的用戶)。 –

回答

2

如果您只想更新密碼字段,則不應使用mass_assignment方法update_attributes,則應使用update_attribute(:password, params[:user][:password])

有可能出現的錯誤與您的params[:password]哈希:如果你使用form_for @user那麼你應該有params[:user][:password]和共同params[:user]其他領域。

您應該檢查給定的用戶是否有效(是否將他保存到數據庫而無需驗證)。

2

檢查您的對象是否有效之前您致電update_attributes

@user.valid? 

我花了很長時間試圖調試類似的問題,只是發現我的數據是不好的開始。它與update_attributes無關。修改罪魁禍首數據庫條目後,我的模型在調用@user.find(id)update_attributes按預期工作後再次生效。