おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Devise でメールアドレス変更時にも確認メールを出す

有名なRails用認証プラグインである devise は、機能毎にモジュール化されており必要な物だけを選んで使うことができます。例えば Confirmable というモジュールを使うと会員登録時に確認メールを飛ばすことができます。ただ、デフォルトではメールアドレス変更時には確認メールが飛びません。そこで下記のやり方でメールアドレス変更時にも確認メールを飛ばすようにしました。

やり方

User モデルを devise 用のモデルとして使っていると仮定します。

config/initializer/devise.rb に下記の一文を追加します。

config.reconfirmable = true

さらに、メールアドレス変更時の一次保存用カラムを追加します。

rails g migration add_unconfirmed_email_to_user unconfirmed_email
rake db:migrate

これだけでメールアドレス変更時に確認メールが飛ぶようになりました。だがしかし、送信されるメールの文面がユーザ登録時と同じです…。テンプレートの切り替えは難しい(devise のソースコード自体に手を入れないとダメ)ので、テンプレート中で分岐させます。

# views/devise/mailer/confirmation_instructions.text.erb
<% if @resource.unconfirmed_email %>
下記のリンクをクリックするとメールアドレスが変更されます。
<% else %>
下記のリンクをクリックしてユーザ登録を完了してください。
<% end %>
<%= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

あとメール中のURLをクリックした後表示される flash メッセージも同じになります。これも切り替えるのが難しいので、会員登録でもメールアドレス変更でも意味の通る文言にしておく必要があります。"メールアドレスの確認が完了しました" とか。

どうしてもメッセージを別にしたい場合は ConfirmationsController をオーバライドする必要があるでしょう。

所感

たかだか「メールアドレス変更時にも確認メールを出す」をきちんとやろうとしたくらいでそれなりにきちんと(stackoverflow みたり github の issue みたりソースコード読んだり)調査する必要があったので、初心者に devise は大分厳しいなーという気持ちになりました。devise が敷いてるレール上から外れない前提なら便利だと思いますが、それなりに凝ろうとしたら死あるのみではないでしょうか。

だからと言って上級者な人なら devise を便利に使えるかというとそうでもない気もします…。最近はみなさんどんな認証ライブラリを使ってるのでしょうか。