LoginSignup
3
4

More than 5 years have passed since last update.

deviseでemailとusernameのどちらでもログインできるようにする

Posted at

テーブルにusernameカラムを追加する

usernameカラムを追加

ターミナル
$ rails generate migration add_username_to_users username:string:uniq
$ rake db:migrate

フォームから送られたパラメーター許可の設定

app/controllers/application_controller.rb
# deviseコントローラーにconfigure_permitted_parametersメソッドを追加
  before_filter :configure_permitted_parameters, if: :devise_controller?

...

  private
    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
      devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
      devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
    end

ログイン用のパラメータlogin(=emailまたはusername)をモデルに設定する

loginパラメータのアクセサを設定

app/models/user.rb
attr_accessor :login

ログイン認証用キーをloginに設定

app/models/user.rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, 
         :validatable, :authentication_keys => [:login]

ログイン認証条件を書き換え(find_first_by_auth_conditionsをオーバーライド)

app/models/user.rb
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
    else
      where(conditions).first
    end
  end

usernameのバリデーションを設定

app/models/user.rb
validates :username,
  :uniqueness => {
    :case_sensitive => false
  },
  :format => { ... } # etc.

Viewの書き換え

Viewファイル一覧を生成(オーバーライドするため)

ターミナル
$ rails g devise:views

Viewファイルの書き換え

app/views/devise/sessions/new.html.erb
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>

↓↓↓書き換え

<p><%= f.label :login %><br />
<%= f.text_field :login %></p>
app/views/devise/registrations/new.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
app/views/devise/registrations/edit.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>

参考

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4