#前提
Deviseで認証するRailsアプリでUserモデルにconfirmable
モジュールが実装されている。
#やりたいこと
ユーザーが確認メールにあるリンクをクリックしたら即サインインできるようにしたい。
#やりかた
ConfirmationsController#show
をオバーライドする。
サインインさせたいタイミングでsign_in(resource)
を呼ぶ。
/app/controllers/confirmations_controller.rb
# Override
class ConfirmationsController < Devise::ConfirmationsController
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
yield resource if block_given?
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_flashing_format?
sign_in(resource) # この一行を加えるのみ
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
end
end
end
deviseネームスペース外に存在するconfirmations_controller.rb
についてDeviseに知らせるため、devise_forに登録する。
/config/routes.rb
Rails.application.routes.draw do
# ...
devise_for :users, controllers: { confirmations: 'confirmations' }
# ...
end
#潜在的危険性
ユーザーが新規登録時に間違ったemailアドレスを記入した場合、たまたまそのemailを受け取った第三者にアカウントを乗っ取られてします可能性がある。
#参考文献