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>
場所はご自由に。
これで登録、ログインにユーザ名が加わった。
このままだとユーザ名の属性指定ができていないけど、それはまた機会があれば。