2012年1月6日金曜日

devise でメールアドレス以外を認証に使う

先ほどメールアドレスで認証するサンプルが作れたのですが、今、考えている状況に
  • メールアドレスが確定しない状況(変更可能な状況)
  • そもそも持っていない可能性もある状況
  • 将来的に外部認証と組み合わせる時にメールアドレスを強制できない状況
が含まれるので、メールアドレス以外をユーザIDとして使う方法が必要になりました。

今の時代は恵まれているので、しっかり誰かが道を作ってくれています。
http://ja.asciicasts.com/episodes/210-customizing-devise
http://d.hatena.ne.jp/kaorumori/20110824/1314168534

config/initializers/devise.rb にて
config.authentication_keys = [ :username ]
元々の設定値は :email になっています。

さらに、app/views/devise/session/new.html.erb および app/views/devise/registrations/new.html.erb にて、:username 用の text_field を追加します。

この辺り(テキストフィールド欄の追加)は見よう見まねで何とかなったのですが…。
上記の2つの記事では「既に存在しているユーザのフィールド(username)の値を認証に使う」というものでしたが、username の値を登録したいと思って regisrations/new.html.erb に単純にテキストフィールドを追加したらハマりました。

コンソールログをきちんと読め、という話なのですが、
WARNING: Can't mass-assign protected attributes: username
というログが出てきます。
app/models/user.rb で、attr_accessible に :username を追加してあげる必要があったようです。
こんな記事を見つけました。
http://trwtnb.blogspot.com/2009/11/rubyrails-warning-cant-mass-assign.html

おまけ

email フィールドに unique 制約があるので(適当なメールアドレスをでっち上げればいいだけなんですが…)、user テーブルを何度も作り直しました。
ってことで、 rake db:migrate:reset をおぼえた!

0 件のコメント:

コメントを投稿