Rails+Deviseでユーザー名でサインインできるようにする

タイトルのように成功したのでメモ。

まずは users テーブルに name 列を追加。

takatoh@nightschool $ rails g migration add_name_to_users name

できたマイグレーションファイルを編集。name 列にインデックスをつけてユニークにする。

add_index :users, :name, unique: true

でもってマイグレート。

takatoh@nightschool $ rake db:migrate

これでデータベースの準備は完了。

次に Devise の設定。config/initializers/devise.rb の32行目をアンコメントして :email を :name に変更。

config.authentication_keys = [ :name ]

これで、Devise はユーザー認証にメールアドレスじゃなくユーザー名を使うようになる。

Devise がユーザー名を受け付けるように configure_pergitted_parameters をオーバーライド。これは app/controllers/application_controller.rb で行う。

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email, :password, :password_confirmation, :admin)}
  devise_parameter_sanitizer.for(:sign_in) {|u| u.permit(:name, :password)}
  devise_parameter_sanitizer.for(:account_update) {|u| u.permit(:name, :email, :password, :password_confirmation, :admin)}
end

あとはビューの変更だ。app/views/users/registrations/new.html.erb にユーザー名の欄を追加し、app/views/users/sessions/new.html.erb には email の欄の代わりにユーザー名の欄を作る。前者はサインアップ、後者はサインインの時に使われるテンプレート。

# 行を追加
<div><%= f.label :name %><%= f.text_field :name, autofocus: true %></div>
# :email から :name に変更
<div><%= f.label :name %><%= f.text_field :name, autofocus: true %></div>

これでひと通り終了。試してみよう。

sign-up-with-name

うまくいった!