有名な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 を便利に使えるかというとそうでもない気もします…。最近はみなさんどんな認証ライブラリを使ってるのでしょうか。