2012-10-19 77 views
1

我想驗證兩列在我的用戶模型中是唯一的。我搜索谷歌和從我的理解下面的代碼將無法正常工作:驗證兩列的唯一性

validates :login, :uniqueness=>true 
validates :email, :uniqueness=>true 

在我的情況下這樣做,將驗證電子郵件的唯一性,但不會驗證登錄用戶的唯一。我設置登錄在數據庫上必須是唯一的。但是,如果它已經存在,所有將會產生的運行時錯誤。我不想在生產中出現這種錯誤,因爲這會導致500個內部服務器錯誤,用戶不會理解。

關於如何驗證這兩個字段的唯一性的任何想法?

認證時使用:

  • 慘慘
  • 設計
  • 設計Invitable

更新:

從我可以告訴這個問題是原因d由Devise,特別是驗證電子郵件和密碼的validatable模塊。

更新2:

從設計卸下可驗證模塊將導致既不唯一性檢查。

更新3:

看來,遺贈是不是造成問題的原因。相反,名爲Devise Invitable的寶石是。刪除這個寶石會導致驗證被觸發。它也似乎是這個寶石試圖強制電子郵件領域的驗證。由於這種寶石的性質,它是有道理的,但不應該被阻擋。

+1

您使用的是驗證寶石嗎?如果是這樣,那可能會引起驗證。這應該起作用,所以上游有某處衝突。 – JohnMetta

+0

@JohnMetta我正在使用CanCan與Devise –

+0

你所描述的應該工作。但你也可以嘗試「validates_uniqueness_of:login,:email」 - 這個運行時錯誤是怎麼樣的?您正在使用哪種版本的導軌? – tmaximini

回答

0

的問題是用叔他devise_invitable創業板。在設備初始化程序中,我必須設置

config.validate_on_invite = true 

確保驗證已執行,默認值爲false。我也必須刪除設計驗證模塊。

9

應該可以通過scope來完成,並添加到devise的默認驗證中。

對於導軌3個版本:

validates :email, :uniqueness => {:scope => :login} 

價:

+0

當我嘗試這個解決方案時,我得到'''救援塊中的驗證':未知 驗證器:'ScopeValidator'(ArgumentError)'''當試圖啓動rails服務器時。 –

+0

驗證,我也得到了同樣的錯誤。我的錯;我已經給出瞭解決方案的Rails 2版本。我更新瞭解決方案的Rails 3版本的答案。驗證它在我身邊運作。屬性的順序很重要。我給出的解決方案驗證了新電子郵件與現有登錄結合的獨特性。 –

+0

儘管您的解決方案可能有效。我認爲devise_invitable存在潛在的問題,刪除此gem會導致正確的行爲,但會削弱應用程序所需的某些功能(即gem所要做的)。 –

0

該代碼在Rails 3.2.8上運行得非常好。我測試過它...

也許您的寶石存在一些問題...