deviseでユーザ名でログインできるようにする。

deviseのログインidはデフォルトだとメールアドレスだが、それをユーザ名でログインできるようにしようというお話。

環境: 環境: Ubuntu11.10, RVM1.13.4, Rails3.2.3, devise2.1.2


1. マイグレーションファイルにユーザ名の項目を追加する。

ログイン用のテーブルusersにユーザ名のカラムを加える。
db/migrate/2012(中略)_devise_users_create.rbに以下を追加。

t.string :username, :null => false

また、ユーザ名がかぶると問題なので、以下も追加。

add_index :users, :username, :unique => true


2. テーブルを更新する。

% rake db:migrate

(注: 私の環境だとうまくいかなかったけど、一度rake db:dropしてテーブルを削除してから実行したらうまくいった。)


3. usernameへのアクセスを可能にする。

app/models/user.rbのattr_accessibleの行を以下のように変更。

attr_accessible :email, :password, :password_confirmation, :remember_me, :username

これで、railsアプリケーションでユーザ名を扱えるようになった。


4. usernameを認証キーとして使用できるようにする。

config/initializers/devise.rbの

# config.authentication_keys = [ :email ]

config.authentication_keys = [ :username ]

と改変。(非コメント化して値を変えた)


5. deviseのビューを編集できるようにする。

deviseのビューはデフォルトでは作られていない。

% rails generate devise:view users

を実行し、ビューを編集できるようにする。


6. ログイン画面の改変

app/views/users/sessions/new.html.erbを改変。

<div><%= f.label :email %><br />
<%= f.email_field :email %></div>

<div><%= f.label :username %><br />
<%= f.text_field :username %></div>

にする。


7. サインアップ画面の改変

app/views/users/registrations/new.html.erbに以下を追加。

<div><%= f.label :username %><br />
<%= f.text_field :username %></div>

場所はご自由に。


これで登録、ログインにユーザ名が加わった。
このままだとユーザ名の属性指定ができていないけど、それはまた機会があれば。

参考: ASCIIcasts - “Episode 210 - Deviseのカスタマイズ”