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