2010-08-22 103 views
19

我的用戶模型包含:名稱,電子郵件和密碼字段。所有3個都有長度驗證。 「更新帳戶」網頁允許用戶更新他的姓名和電子郵件地址,但不是密碼。提交時,params [:user]是在Rails 3中,當我不試圖更新密碼時,如何跳過驗證密碼字段?

{"name"=>"Joe User", "email"=>"[email protected]"} 

請注意,沒有「密碼」鍵,因爲表單不包含這樣的輸入字段。

當我打電話

@user.update_attributes(params[:user]) 

密碼驗證失敗。但是,由於我沒有嘗試更新密碼,因此我不希望在此更新上運行密碼驗證。我很困惑爲什麼當params [:user]不包含「密碼」鍵時密碼驗證正在運行。

請注意,我想在其他地方有一個單獨的網頁,允許用戶更新他的密碼。而對於那個提交,密碼驗證應該運行。

謝謝。

+1

它不應該運行密碼驗證,並且如果密碼字段有效首先關閉,它將失敗。你說你沒有通過密碼,但我有你的懷疑。 – 2010-08-22 22:59:48

回答

27

我的應用程序是這樣的

attr_accessor :updating_password 

validates_confirmation_of :password, :if => should_validate_password? 

def should_validate_password? 
    updating_password || new_record? 
end 

所以你必須model.updating_password = true的核查採取地方,你沒有做到這一點在創建。

這一點我在一個良好的railscast發現在http://railscasts.com/episodes/41-conditional-validations

+0

謝謝你,mathepic。這對我有效。 – Sanjay 2010-08-22 21:23:04

+0

也許可以使用'password_changed?'幫助器? – 2012-10-16 22:59:34

+0

@PeterEhrlich在使用'has_secure_password'時會引發缺少的方法。你必須在'password_digest'上調用它,因爲如果密碼存在,它將被重新加密。 – Mohamad 2013-08-13 15:09:24

0

,我的工作就使用以下的應用:

validates_confirmation_of :password, 
           :if => Proc.new { |account| 
               !account.password.blank? 
               || !account.password_confirmation.blank? 
               || account.new_record? } 

根據您的要求,您可能要刪除的new_record?檢查

+0

這似乎是刪除確認點 - 您不會確認他們是否沒有在表單中指定確認。 – alternative 2010-08-22 19:50:13

+0

嗯...看起來像一個錯誤,你是對的。 – 2010-08-22 23:23:34

1

在您的用戶模型中,如果未設置密碼驗證,則可以忽略密碼驗證。

validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? } 
+3

這會允許某人設置空密碼嗎? – Pete 2012-06-24 11:20:47

1

使用update_attributes如果在params哈希表沒有任何鍵不會更改密碼的值。

驗證不會僅針對更改的字段運行。它也驗證現有值。

您的驗證必須失敗,因爲密碼字段包含已保存在數據庫中的一些無效內容。我猜測這可能是因爲你在驗證之後對它進行哈希處理,而你正在嘗試驗證散列字符串。

您可以使用您使用自定義方法驗證的虛擬屬性(實例變量或方法),然後將散列分配給存儲的密碼字段。看看this technique的想法。

0
When password is added then only confirmation will be called and presence will call on create action only 

    **validates_presence_of :password, :on =>:create** 

    **validates_confirmation_of :password** 
相關問題