電子メールをサインインのデフォルトフィールドとして使用したくない場合は、別のフィールドを指定することができます。これらの例ではフィールド名として:username
を使用しますが、任意のフィールドを使用できます。これを実装するために
、config/initializers/devise.rb
ファイルに次のテキストのコメントを解除し、あなたがそのような:username
など、サインイン時に使用するフィールドを指定します。
config.authentication_keys = [:username]
もう一つの方法は、モデルを変更することです:
devise :database_authenticatable, :authentication_keys => [:username]
次に、モデルに検証を追加します。
validates :email,uniqueness: true
validates :username,uniqueness: true
次に、移行を作成して移行:
rails generate migration add_username_to_users username:string:uniq
rake db:migrate
次に、あなたが作成したときにそのフィールドを設定し、ユーザーを編集することができますことを確認してください。より新しいバージョンのRailsでstrong parameters機能を使用する場合は、コントローラ内のそのパラメータの読み取りを.permit(:username)
で許可してください。古いバージョンのRailsを使用している場合は、代わりにattr_accessible :username
というモデルでフィールドにアクセス可能にしてください。
rails generate devise:views
をそして、あなたは新しいフォームフィールドを使用するapp/views/devise/sessions/new.html.erb
とapp/views/devise/registrations/new.html.erb
でビューを変更する必要があります:
この後は、次のコマンドを使用して考案ビューを生成することができます。
最後に、ユーザーが誤った資格情報を提供する場合、または見つからない場合に表示されるエラーメッセージを変更する必要があります。これはconfig/locales/devise.en.yml
で行います。次を探します。
invalid: 'Invalid email or password.'
not_found_in_database: 'Invalid email or password.'
と、このように変更します。あなたは
invalid: "Invalid %{authentication_keys} or password."
not_found_in_database: "Invalid %{authentication_keys} or password."
が表示された場合
invalid: 'Invalid username or password.'
not_found_in_database: 'Invalid username or password.'
代わりに、あなたは何も変更する必要はありません。
電子メールを認証キーとして使用していない場合、ユーザーが同じ電子メールアドレスを持つ複数のアカウントを持つ可能性があります。これにより、 "リカバリ可能な"モジュールはうまく動作しません。これは、一致する電子メールを見つけた最初のアカウントへのパスワードリセット電子メール内のリンクのみを含むためです。すべてのアカウント情報をパスワードリセット電子メールに追加する実装方法については、a thread on the Google Groupです。
重要な注意:あなたはvalidatable
モジュールを使用する場合は、email_required?
とemail_changed?
を定義します。
# app/models/model.rb
class Model < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable,
:trackable, :lockable, :validatable
def email_required?
false
end
def email_changed?
false
end
# use this instead of email_changed? for rails >= 5.1
def will_save_change_to_email?
false
end
end
あなたがconfirmable
やrecoverable
モジュールを使用している場合は、あなただけのfalse
にemail_changed?
を定義する必要があります。