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
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_token和reset_token.如果没有else分支,对此方法的任何没有email参数的调用都将失败,或者使用nil电子邮件加载用户.