2011-06-12 89 views
6

我正在使用devise在rails應用程序中進行身份驗證,並且我的應用程序可以有許多子域。 目前它使用電子郵件作爲身份驗證,並且電子郵件應該是唯一的整個應用程序。範圍設計電子郵件中的子域的電子郵件

現在有什麼辦法可以將電子郵件地址的唯一性範圍限制在子域,而不是整個應用程序? 我試過了:

validates_uniqueness_of :email, :scope => :account_id 

但沒有奏效。它仍然尋求整個應用程序的電子郵件的唯一性,而不是註冊新用戶時的特定子域。

任何幫助將不勝感激。

+0

存儲在用戶表中的子域名在哪裏? – Dogbert 2011-06-12 15:48:54

+0

我有存儲子域名的帳戶模型。賬戶與用戶模型有着許多關係。我在用戶模型中嘗試了上面提到的validates_uniqueness_of,但徒勞無功.. :( – kxhitiz 2011-06-12 16:24:00

+0

請問您可以在模型(Account,User)中添加它們之間的關係(has_many,belongs_to)和它們存儲的相關屬性的基本要點嗎? – Dogbert 2011-06-12 17:19:38

回答

7

好的,我這樣做。
在devise.rb編輯config.authentication_keys作爲

config.authentication_keys = [ :login, :account_id ] 

而且我創建隱藏字段包含在登錄表單ACCOUNT_ID

<%= f.hidden_field :account_id, :value => @account.id %> 

這裏@account保持與當前的子域的帳戶。

而且在user.rb增加了以下受保護的方法覆蓋find_for_database_authentication類方法

protected 
def self.find_for_database_authentication(warden_conditions) 
conditions = warden_conditions.dup 
login = conditions.delete(:login) 
account_id = conditions.delete(:account_id) 
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).where("account_id = ?", account_id).first 
end 

如果有則更好的解決方案隨意評論傢伙..
乾杯!

+0

有沒有辦法,而不是有account_id在窗體上,從子域找到它?對於較大的應用程序,它是不舒服的揭露帳戶id 。: - \ – NullVoxPopuli 2013-06-21 15:56:08

+0

確認不適用於此解決方案。 – 2013-12-23 03:47:53

+0

如何使用account_id範圍內的用戶電子郵件進行確認工作? – 2013-12-23 03:48:20

0

您如何保存您的用戶,您是否在嘗試保存之前將帳戶設置在用戶模型上?如果沒有,那麼你將會瞄準一個零的account_id - 因此它看起來像沒有範圍。

相關問題