是否有Rails Gem Devise的解决方案允许用户拥有多封电子邮件?

AnA*_*ice 14 ruby-on-rails devise ruby-on-rails-3

我正在寻找一种解决方案,允许我的应用上的用户拥有超过1封电子邮件.这应该类似于Facebook,LinkedIn和Quora.帐户可以有多封电子邮件,1为主要邮件.

有没有设计的交钥匙解决方案?我希望不必从头开始写这个,因为它很常见.

想法?谢谢

Bob*_*Bob 15

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

例如模型UserEmail.

class UserEmail < ActiveRecord::Base
    belongs_to :user
end

class User < ActiveRecord::Base
    has_many :user_emails
end
Run Code Online (Sandbox Code Playgroud)

并覆盖devise的方法来查找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
Run Code Online (Sandbox Code Playgroud)

在这里阅读有关覆盖的更多信息:https://github.com/plataformatec/devise/wiki/How-To : -Allow-users-to-sign-in-using-their-username-or-email-address


Bra*_*rad 8

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
Run Code Online (Sandbox Code Playgroud)

电子邮件检查和来电super是非常重要的,因为设计也采用这种方法来查找User由s confirmation_token,unlock_tokenreset_token.如果没有else分支,对此方法的任何没有email参数的调用都将失败,或者使用nil电子邮件加载用户.

  • 谢谢)更新了我的答案) (2认同)