2011-10-03 105 views
1

我有以下驗證:軌密碼更新驗證問題

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..40 }, :format => { :with => pass_regex }, :unless => :nopass? 

然後,當我嘗試無密碼更新(?NOPASS爲真)出現以下錯誤:

There were problems with the following fields: 

Password is too short (minimum is 6 characters) 
Password is invalid 

注意:除非作品在:存在和:確認,但不在:長度或:格式。

我該如何解決這個問題?

+0

這Rails的版本您使用? – Anatoly

+0

我正在使用Rails 3.0.9 – mornaner

回答

1

我曾與一些奇怪的問題:確認標誌爲好,這我從來沒有想通了,但是這就是我在我的Rails應用程序3.0.x的解決了這個問題:

attr_accessor :password_confirmation 

validates :password, :presence => true, :length => {:within => PASSWORD_MIN_LENGTH..PASSWORD_MAX_LENGTH} 

validate :password_is_confirmed 

    def password_is_confirmed 
if password_changed? # don't trigger that validation every time we save/update attributes 
    errors.add(:password_confirmation, "can't be blank") if password_confirmation.blank? 
    errors.add(:password_confirmation, "doesn't match first password") if password != password_confirmation 
end 
end 

我知道這並不是解釋爲什麼你的代碼不能正常工作,但如果你正在尋找一個快速的臨時解決方案 - 我希望這會有所幫助。

+0

如何定義password_changed?我在保存前加密密碼。 – mornaner

+0

好吧,我做到了,這工作。謝謝。 – mornaner

+1

對於所有屬性,您會自動獲取_changed?方法,這來自ActiveRecord。你可以嘗試使用它: validates_presence_of:password_confirmation,:if =>:password_changed? 自己還沒有嘗試過,但是您可能可以將它放在上面的代碼中。 (注意:在這種情況下,你仍然需要attr_accessor:password_confirmation;我認爲:confirmation => true應該是這樣) – Svilen