14

アプリのユーザーが複数の電子メールを持つことを許可するソリューションを探しています。これは、Facebook、LinkedIn、および Quora と同様に機能するはずです。アカウントが複数の電子メールを持つことができる場合、1 つがプライマリです。

デバイスを利用できるターンキー ソリューションはありますか? 非常に一般的であるため、これをゼロから作成する必要がないことを願っています。

アイデア?ありがとう

4

7 に答える 7

15

うーん...新しいモデルを作成することをお勧めします。次のようにします。

たとえば、モデルは になります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 をご覧ください。

于 2013-04-29T18:14:40.573 に答える
4

新しいモデルを作成することをお勧めしますSecondaryEmail。缶
、とそれぞれ。Userhas_many :secondary_emailsSecondaryEmail belongs_to :user

の各電子メールの一意性の検証を追加する必要がSecondaryEmailあり、さらに、新しい SecondaryEmail がすでにユーザーのプライマリ電子メールになっていないことを確認する必要があります。これらの検証を使用して、ユーザーが自分の secondary_emails を追加できる
ように、インターフェイスを提供します。User

次のステップはSessionControllerDevise のオーバーライドです。ログイン手順の際に、ユーザーのプライマリ メールにメールが見つからない
場合のログイン手順を設定します。SecondaryEmail.where(:email => params[:email])存在する場合は、そのユーザーのパスワードで認証します。存在しない場合は、ユーザーは存在しません。

これが私がこれまでに思いついたものです。これについての専門家の見解とアプローチを知りたいです。:)

于 2013-04-29T18:15:26.787 に答える
3

しばらく前にこの問題に遭遇し、私のブログで解決策を概説しました。

手順は次のとおりです。

  • メール情報は、追加のモデルに保存する必要がありますEmail。したがって、 aには関連するインスタンスUserが多数あります。Email
  • ユーザーとのコミュニケーションに使用できるデフォルトの電子メールとして 1 つの電子メールを指定することをお勧めします。
  • Userクラスのクラスメソッドは、find_first_by_auth_conditions提供された資格情報のユーザーを見つけるために使用されます。そのため、Emailモデルを使用して検索するには、そのメソッドをオーバーライドする必要があります。
  • emailユーザーのメソッドの存在を暗黙的に想定しているため、デフォルトのビューを変更する必要があります。ビューを完全に書き直す代わりに、ユーザーのデフォルトの電子メールに委譲する電子メールのプロキシ アクセサーを追加することができます。
  • ユーザーが複数の電子メールを持つことが許可されている場合、アカウント編集ページで電子メールを追加/削除するユーザー機能も提供したいと考えています。
  • omn​​iauth の統合が必要な場合は、devise User.from_omniauthwiki で概説されている のストック実装を変更して、複数のメールをサポートする必要があります。

私の実装はGithubで入手できます。

于 2014-09-13T18:42:48.633 に答える
0

devise-multi_email gem を使用できます: 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

于 2016-03-04T11:06:13.580 に答える