我正在尋找一種解決方案,以允許我的應用程序上的用戶擁有多個電子郵件。這應該與Facebook,LinkedIn和Quora類似。一個帳戶可以有多個電子郵件,其中1個爲主要電子郵件。Rails Gem Devise是否有解決方案以允許用戶擁有多個電子郵件?
是否有一個交鑰匙解決方案的設計avaialble?我希望不必從頭開始編寫它,因爲它很常見。
想法?由於
我正在尋找一種解決方案,以允許我的應用程序上的用戶擁有多個電子郵件。這應該與Facebook,LinkedIn和Quora類似。一個帳戶可以有多個電子郵件,其中1個爲主要電子郵件。Rails Gem Devise是否有解決方案以允許用戶擁有多個電子郵件?
是否有一個交鑰匙解決方案的設計avaialble?我希望不必從頭開始編寫它,因爲它很常見。
想法?由於
嗯......我會建議建立新的模式,你會做這樣的事情:
例如模型是UserEmail
。
class UserEmail < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :user_emails
end
和覆蓋色器件的方法來查找記錄在User
模型:
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if email = conditions.delete(:email)
User.includes(:user_emails).where('user_emails.email = ?', email).first
else
super(warden_conditions)
end
我建議你創建一個新的模型SecondaryEmail
。
A User
可以has_many :secondary_emails
,並且每個SecondaryEmail
belongs_to :user
。
您必須爲SecondaryEmail
中的每封電子郵件添加驗證唯一性,此外還必須確保沒有新的SecondaryEmail已經是任何用戶的主要電子郵件。
提供接口,以便User
可以添加他的secondary_emails以及這些驗證。
下一步將覆蓋SessionController
的設計。
在任何登錄過程中,只要在用戶的主電子郵件中找不到電子郵件,就設置登錄過程SecondaryEmail.where(:email => params[:email])
。如果存在,則使用該用戶的密碼進行身份驗證,否則,用戶不存在。
這就是我到目前爲止所提出的。我真的很想知道專家的觀點和方法。 :)
這裏給出的答案很不錯,應該可以解決你的問題。要回答你最後的問題,我認爲你不會爲此找到寶石,因爲它太簡單了,即使它很常見。只要按照建議從頭開始,它應該不會太多工作:)
鮑勃的答案是接近,但它有一個潛在的危險的錯誤。該find_first_by_auth_conditions
方法應該是這樣的:
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if email = conditions.delete(:email)
User.includes(:user_emails).where('user_emails.email = ?', email).first
else
super(warden_conditions)
end
end
電子郵件檢查,並打電話給super
是很重要的,因爲設計也使用了這種方法,通過confirmation_token
,unlock_token
,並reset_token
查找User
秒。沒有else分支,任何對此方法沒有email
參數的調用都將失敗,或者使用nil
電子郵件加載用戶。
謝謝)更新我的回答) – Bob 2013-05-16 07:35:31
我前面遇到過這個問題 - 並在my blog中概述瞭解決方案。
的步驟總結如下:
Email
。所以User
有許多相關的Email
實例。User
類find_first_by_auth_conditions
的類方法用於查找用戶提供的憑據 - 因此我們將不得不覆蓋該方法以使用Email
模型進行搜索。email
方法的用戶。我們可以使用添加一個代理訪問器來代替用戶的默認電子郵件,而不是完全重寫視圖。User.from_omniauth
將不得不修改以支持多個電子郵件。我的實施可用on Github。
Bob的答案在軌扔了SQL錯誤我4.1.5-以下變化得到它的工作,每http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations:
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if email = conditions.delete(:email)
User.includes(:user_emails).where(user_emails: {email: email}).first
else
super(warden_conditions)
end
end
您可以使用色器件,multi_email寶石:https://github.com/allenwq/devise-multi_email
更換與devise :multi_email_authenticatable
,讓您的型號可能是這樣的:
class User < ActiveRecord::Base
has_many :emails
# Replace :database_authenticatable, with :multi_email_authenticatable
devise :multi_email_authenticatable, :registerable
end
class Email < ActiveRecord::Base
belongs_to :user
end
如果你想共同所有的電子郵件nfirmable,並從你的電子郵件的人找回密碼,只需
devise :multi_email_authenticatable, :multi_email_confirmable, :confirmable
是否要啓用登錄與二次郵件也是如此,對於任何用戶? – kiddorails 2013-04-29 17:50:57
是的,用戶只能使用他們的任何電子郵件登錄。此外,電子郵件不應該能夠共存,整個系統中的每個帳戶都有唯一的電子郵件...就像Facebook如何處理這個... – AnApprentice 2013-04-29 17:51:34
我不知道現有的解決方案,但如果您決定自己寫,你可以從這個開始,至少類似(多個可能的登錄值):https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in使用他們的用戶名或電子郵件地址 – MrTheWalrus 2013-04-29 18:05:07