我正在寻找一个解决方案,让我的应用程序用户已经超过1个电子邮件。 这应该工作类似于Facebook,LinkedIn和Quora的。 当一个帐户可以有多个电子邮件,1作为主。
有没有制定一个交钥匙解决方案avaialble? 我希望没有给它是如此普遍从头开始写这个。
想法? 谢谢
我正在寻找一个解决方案,让我的应用程序用户已经超过1个电子邮件。 这应该工作类似于Facebook,LinkedIn和Quora的。 当一个帐户可以有多个电子邮件,1作为主。
有没有制定一个交钥匙解决方案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
了解更多关于替代的位置: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address
Bob的答案是接近,但它有一个潜在的危险错误。 该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
是非常重要的,因为设计也采用这种方法来查找User
的S confirmation_token
, unlock_token
和reset_token
。 如果没有else分支,这种方法没有任何一个来电email
参数,要么失败,或者加载用户与nil
电子邮件。
我建议你创建一个新的模型SecondaryEmail
。
甲User
可以has_many :secondary_emails
,并且每个SecondaryEmail
belongs_to :user
。
你将需要添加的唯一性验证为每封电子邮件SecondaryEmail
,并进一步将不得不确保没有新的SecondaryEmail已经是任何用户的主电子邮件。
提供的接口,使得User
可以添加自己的secondary_emails,这些验证。
下一步将是压倒一切的SessionController
设计的。
一旦任何登录程序,设置为您的登录过程SecondaryEmail.where(:email => params[:email])
每当一个电子邮件没有在用户的主电子邮件找到。 如果存在,则与该用户的密码进行身份验证,否则,用户不存在。
这是我想出了这么远。 我真的很想知道专家们在这个观点和方法。 :)
我碰到这个问题就前一段时间-并概述了解决我的博客 。
步骤总结如下:
Email
。 因此,一个User
有很多相关的Email
实例。 User
类find_first_by_auth_conditions
被用于查找提供的凭据用户-所以我们将不得不重写方法使用搜索Email
模型。 email
的用户的方法。 而不是重写的意见完全可以使用添加代理访问电子邮件委托给该用户的默认电子邮件。 User.from_omniauth
在色器件维基列出将要进行修改,以支持多个电子邮件。 我实现可用Github上 。
这里给出的答案是相当不错的,而且应该解决您的问题。 要回答你的最后一个问题,我不认为你会发现这个宝石,因为它太简单了,即使这是很常见的。 只是从头开始让它的建议,它不应该是太多的工作:)
Bob的答案4.1.5-下面的变化得到了它的工作,每个轨道扔了SQL错误我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 :authenticatable
与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
如果你希望所有的邮件被确认的,并从你的电子邮件的人找回密码,只需
devise :multi_email_authenticatable, :multi_email_confirmable, :confirmable