アプリのユーザーが複数の電子メールを持つことを許可するソリューションを探しています。これは、Facebook、LinkedIn、および Quora と同様に機能するはずです。アカウントが複数の電子メールを持つことができる場合、1 つがプライマリです。
デバイスを利用できるターンキー ソリューションはありますか? 非常に一般的であるため、これをゼロから作成する必要がないことを願っています。
アイデア?ありがとう
アプリのユーザーが複数の電子メールを持つことを許可するソリューションを探しています。これは、Facebook、LinkedIn、および Quora と同様に機能するはずです。アカウントが複数の電子メールを持つことができる場合、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 をご覧ください。
新しいモデルを作成することをお勧めしますSecondaryEmail
。缶
、とそれぞれ。User
has_many :secondary_emails
SecondaryEmail
belongs_to :user
の各電子メールの一意性の検証を追加する必要がSecondaryEmail
あり、さらに、新しい SecondaryEmail がすでにユーザーのプライマリ電子メールになっていないことを確認する必要があります。これらの検証を使用して、ユーザーが自分の secondary_emails を追加できる
ように、インターフェイスを提供します。User
次のステップはSessionController
Devise のオーバーライドです。ログイン手順の際に、ユーザーのプライマリ メールにメールが見つからない
場合のログイン手順を設定します。SecondaryEmail.where(:email => params[:email])
存在する場合は、そのユーザーのパスワードで認証します。存在しない場合は、ユーザーは存在しません。
これが私がこれまでに思いついたものです。これについての専門家の見解とアプローチを知りたいです。:)
しばらく前にこの問題に遭遇し、私のブログで解決策を概説しました。
手順は次のとおりです。
Email
。したがって、 aには関連するインスタンスUser
が多数あります。Email
User
クラスのクラスメソッドは、find_first_by_auth_conditions
提供された資格情報のユーザーを見つけるために使用されます。そのため、Email
モデルを使用して検索するには、そのメソッドをオーバーライドする必要があります。email
ユーザーのメソッドの存在を暗黙的に想定しているため、デフォルトのビューを変更する必要があります。ビューを完全に書き直す代わりに、ユーザーのデフォルトの電子メールに委譲する電子メールのプロキシ アクセサーを追加することができます。User.from_omniauth
wiki で概説されている のストック実装を変更して、複数のメールをサポートする必要があります。私の実装はGithubで入手できます。
devise-multi_email gem を使用できます: 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