2012-08-24 69 views
5

我一直在尋找一種方法來允許用戶更改其設置(用戶模型)而無需更改密碼(他們仍然需要輸入其當前密碼)。設計出現似乎允許這一點,但是當你刪除validatable模塊並設置自定義驗證時,似乎你需要解決一下。Rails3 +設計:更新時防止密碼驗證

我已經安裝在我的用戶模型以下驗證:

validates :password, length: { in: 6..128 } 

報名時,用戶需要指定他的密碼(這是我期望的那樣)。但是,在更新設置時,如果我將密碼留空,則會向用戶發出錯誤,指出密碼必須至少包含6個字符。

我該如何解決這個問題而不必改變Devise的工作方式或者實現某種自定義控制器的方式?

回答

13

也許這對某些人來說顯得很明顯,但是我花了一段時間才把它們合在一起。經過幾個小時的嘗試不同的解決方案和解決方法並遍佈整個地方,我在Rails驗證中做了更深入的研究,發現了一些構建方法,將它們放在一起時,可以使其變得非常簡單。

我所要做的就是設置創建操作的驗證和更新操作的驗證,並在更新時允許空白。

validates :password, length: { in: 6..128 }, on: :create 
    validates :password, length: { in: 6..128 }, on: :update, allow_blank: true 

因此,我得到了我想要的行爲,它只有兩行簡短的代碼。

附加說明:

起初,我試過這樣:

validates :password, length: { in: 6..128 }, on: :create 

這是錯誤的,因爲它會完全跳過更新的驗證。用戶可以在更新設置時設置短/長(或空白?)密碼。

3

設計有其自己的方法來實現,update_without_password,它更新記錄屬性而不詢問當前的密碼。切勿允許更改當前密碼。

注意。如果您正在使用此方法,則應該重寫此方法以保護您不希望在沒有密碼的情況下更新的其他屬性。

實施例:

def update_without_password(params={}) 
    params.delete(:email) 
    super(params) 
end 

它是所有在設計文檔。 http://rdoc.info/gems/devise/index

6

將此代碼添加到您的用戶模式。

private 
def password_required? 
    new_record? ? super : false 
end 
6

我試圖阿邁勒·庫馬爾液,但遺憾的是它並沒有幫助我解決同樣的問題,所以這裏被修改的實際項目測試的解決方案版本。

以下是devise/models/validatable的代碼。RB模塊

protected 

# Checks whether a password is needed or not. For validations only. 
# Passwords are always required if it's a new record, or if the password 
# or confirmation are being set somewhere. 
def password_required? 
    !persisted? || !password.nil? || !password_confirmation.nil? 
end 

,當你離開空密碼和確認密碼字段,同時更新用戶信息,因爲這種情況始終爲false驗證失敗:

!password.nil? || !password_confirmation.nil? 

密碼和password_confirmation字段等於空字符串「」,這永遠不會等於零。所以你可以通過重寫password_required來解決這個問題?方法在你的用戶模型中並更改nil?檢查空白?檢查。

protected 

def password_required? 
!persisted? || !password.blank? || !password_confirmation.blank? 
end 

認爲這是解決這個問題的最簡單方法,它不會破壞原始邏輯。也許這是設計的錯誤。

+0

我能夠使用它來處理我的用例,從控制檯添加用戶時跳過密碼要求(因爲我使用的是devise_invitable模塊)。爲了實現這個目標,我必須將'!persisted?'改成'persisted?'。 –