是否有Rails的宝石设计的解决方案,让用户拥有多个电子邮件?(Is there a solutio

2019-09-01 09:39发布

我正在寻找一个解决方案,让我的应用程序用户已经超过1个电子邮件。 这应该工作类似于Facebook,LinkedIn和Quora的。 当一个帐户可以有多个电子邮件,1作为主。

有没有制定一个交钥匙解决方案avaialble? 我希望没有给它是如此普遍从头开始写这个。

想法? 谢谢

Answer 1:

嗯......我会建议建立新的模式,你会做这样的事情:

例如模型是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



Answer 2:

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_tokenunlock_tokenreset_token 。 如果没有else分支,这种方法没有任何一个来电email参数,要么失败,或者加载用户与nil电子邮件。



Answer 3:

我建议你创建一个新的模型SecondaryEmail
User可以has_many :secondary_emails ,并且每个SecondaryEmail belongs_to :user

你将需要添加的唯一性验证为每封电子邮件SecondaryEmail ,并进一步将不得不确保没有新的SecondaryEmail已经是任何用户的主电子邮件。
提供的接口,使得User可以添加自己的secondary_emails,这些验证。

下一步将是压倒一切的SessionController 设计的。
一旦任何登录程序,设置为您的登录过程SecondaryEmail.where(:email => params[:email])每当一个电子邮件没有在用户的主电子邮件找到。 如果存在,则与该用户的密码进行身份验证,否则,用户不存在。

这是我想出了这么远。 我真的很想知道专家们在这个观点和方法。 :)



Answer 4:

我碰到这个问题就前一段时间-并概述了解决我的博客 。

步骤总结如下:

  • 电子邮件信息必须存储在一个额外的模型,比如Email 。 因此,一个User有很多相关的Email实例。
  • 我们将最有可能要指定一个电子邮件一样,我们可以使用与用户沟通的默认电子邮件。
  • 在的类方法Userfind_first_by_auth_conditions被用于查找提供的凭据用户-所以我们将不得不重写方法使用搜索Email模型。
  • 我们将不得不改变默认的意见,因为他们暗含的假设存在email的用户的方法。 而不是重写的意见完全可以使用添加代理访问电子邮件委托给该用户的默认电子邮件。
  • 如果用户被允许拥有多个电子邮件 - 我们也想向用户提供工具,以在帐户编辑页面添加/删除电子邮件。
  • 如果你需要omn​​iauth集成-那么股指实施User.from_omniauth在色器件维基列出将要进行修改,以支持多个电子邮件。

我实现可用Github上 。



Answer 5:

这里给出的答案是相当不错的,而且应该解决您的问题。 要回答你的最后一个问题,我不认为你会发现这个宝石,因为它太简单了,即使这是很常见的。 只是从头开始让它的建议,它不应该是太多的工作:)



Answer 6:

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


Answer 7:

您可以使用色器件,multi_email宝石: https://github.com/allenwq/devise-multi_email

更换devise :authenticatabledevise :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



文章来源: Is there a solution for Rails Gem Devise to allow a user to have multiple emails?