2011-05-24 54 views
2

我正在使用Devise進行身份驗證。如果未設置hashed_password,Rails/Devise的驗證將需要設置密碼以及password_confirmationRails中有沒有一種方法可以說「運行所有驗證除外:密碼」?

當我邀請新用戶時,我顯然不想設置他們的密碼,所以當我在我的系統中創建邀請時,它因爲user.password爲空而失敗。

我可以在用戶設置的臨時hashed_password,但是當他們進入自己的密碼,因爲hashed_password設置,這是一個真正的問題將不會發生:password:password_confirmation驗證檢查。

有什麼辦法可以告訴Rails我想運行除:password以外的所有驗證嗎?

我知道Rails有:if的條件,這可能會解決我的問題,但Devise聲明代表我的驗證:password,所以基本上是隱藏的。

我怎樣才能在這裏得到所需的結果?希望在一種不是黑客的方式。

我目前的假設解決方案有點麻煩:我唯一能想到的是創建一個不是用戶模型的新邀請模型,並使用表單的邀請模型。提交邀請時,我可以驗證該邀請並將所有值複製到新的用戶模型。我可以保存該用戶而沒有任何驗證。

這是我夢寐以求的最佳解決方案。

這似乎是我的解決方案會比說一些簡單的像很多工作:

user.save(validations => {:except => :password}) 

編輯:我已經找到了解決方案的一個組成部分,但我仍然有問題。在我們的用戶模型,我們可以覆蓋設計方法,以防止密碼的驗證與此位的代碼邀請:

#protected 
def password_required? 
    !is_invited && super 
end 

is_invited屬性就是我加入users表/模型列。

但是,這裏有一個問題。當用戶接受邀請並且他們到達需要設置其密碼/密碼確認的表單時,valid?總是返回true

這一個讓我深感困惑。我沒有看到requires_password?valid?如何可以在同一時間。如果它需要密碼,它應該進行驗證檢查並導致驗證失敗。

我開始討厭Devise - 或者只是使用寶石在黑匣子中構建應用程序的一部分的想法。我認爲真正的解決方案可能是摒棄Devise,只是從頭開始。這樣,你的應用程序擁有這一切是如何工作:(

回答

0

我最近使用這個偉大的色器件附加開工總量控制:devise_invitable

通常用它使用戶(或任何模型)可以邀請其他用戶加盟。

但我適應它的手動(通過管理面板)邀請新的潛在用戶,以我的應用程序。

希望這有助於!

+0

順便說一句,如果我記得很清楚制定包括一種稱爲skip_password! ,所以你可以重寫y我們的註冊方法在您的用戶模型中並且達到相同的結果。 – 2011-05-24 04:31:27

+0

我想遠離大部分的設計形式。我發現他們需要太多專業化,我甚至可能在某個時候將其交換出去。所以對於複雜的表格,我自己就開始寫這些方法。我可能會繼續這個過程並最終將其交換出去。原因在於,儘可能多的時間節省了我最初的時間,我發現如何定製或按照我想要的方式調整它需要的時間比從頭開始編寫代碼要花費更多的時間。當然,如果你使用Devise 5次,速度會更快,但是對於新用戶...我不認爲它到頭了。 – 2011-05-24 10:35:11

+0

無論如何,回到手邊的任務......設計似乎沒有包含skip_password !,但它包含password_required?可以覆蓋的方法。我想我將不得不創建這個方法並使用一個變量來配置它。 – 2011-05-24 10:39:06

相關問題