LoginSignup
8
11

More than 5 years have passed since last update.

Rails + deviseで、confirmableモジュールが有効のときに、仮登録後のアクションを変更する方法

Last updated at Posted at 2018-04-25

より良い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となって弾かれてしまう。

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11