より良いUIのために
ユーザー登録にメール認証を導入してくれるdeviseのconfirmableモジュール。仮登録後、デフォルトではflashメッセージと共にafter_sign_in_path_forに設定されているパスにredirectされる。しかし、flashメッセージだけではユーザーに優しくないので、きちんとメールを確認して欲しい旨のビューを作りたい。
手順
1. deviseのコントローラーをカスタマイズするための準備をする
Rails4でdeviseのControllerをカスタマイズするを参考に、オーバーライドするdeviseのコントローラを生成し、ルーティングを設定する。
2. 新しく作るページ(confirm_email)のルーティング・コントローラー・ビューを作る
deviseのコントローラーに新たなアクションを追加するには、devise_scopeを使う。:usersではなく:userな点に注意
routes.rb
devise_for :users, controllers: { registrations: 'users/registrations',
sessions: 'users/sessions',
omniauth_callbacks: 'users/omniauth_callbacks' }
# 追加
devise_scope :user do
get 'confirm_email', to: 'users/registrations#confirm_email'
end
users/registration_controller.rb
# 追加
def confirm_email
end
devise/registrations/confirm_email.html.erb
<div>
メールを確認してね!
</div>
3. registration_controllerのafter_inactive_sign_up_path_forに、上記アクションのパスを指定する
confirmableを有効にしている場合は、after_sign_up_path_forではなくafter_inactive_sign_up_path_forに指定する。まだ仮登録で、アカウントが有効になってないため。
users/registration_controller.rb
# コメントアウトを外す
# The path used after sign up for inactive accounts.
def after_inactive_sign_up_path_for(resource)
confirm_email_path
end
備考
deviseのコントローラーに作らなくても普通にusers_controllerに作ればいいのではと思うかもしれないが、それでは上手くいかない。仮登録後、/users/confirm_emailにアクセスはするが、Completed 401 Unauthorizedとなって弾かれてしまう。