Deviseでユーザー登録後のリダイレクト先を変更する
Deviseのカスタマイズに少し苦労しました。
大体標準通りに使えば問題ないのかもしれませんが、少し加工しようとするとちょっと調べないといけないですね。
今回行うことは、Deviseでユーザー登録後に、Thanksページに飛ばすことです。
リダイレクト自体は割と簡単なのですが、コントローラーにアクションを追加するのに手間取りましたorz
コントローラーをカスタマイズする
今回のDeviseはユーザーモデルをベースとして考えています。
まずはカスタマイズするために、下記のコマンドを打ち込みます。
rails generate devise:controllers Users
これでテンプレートが作成されるかと思います。
変更するコントローラーはclass Users::RegistrationsController < Devise::RegistrationsController
になります。
thanksアクションを入れます。
class Users::RegistrationsController < Devise::RegistrationsController # before_action :configure_sign_up_params, only: [:create] # before_action :configure_account_update_params, only: [:update] # GET /resource/sign_up # def new # super # end # POST /resource def create super end # GET /resource/edit # def edit # super # end # PUT /resource # def update # super # end # DELETE /resource # def destroy # super # end # GET /resource/cancel # Forces the session data which is usually expired after sign # in to be expired now. This is useful if the user wants to # cancel oauth signing in/up in the middle of the process, # removing all OAuth session data. # def cancel # super # end def thanks end # protected # If you have extra params to permit, append them to the sanitizer. # def configure_sign_up_params # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) # end # If you have extra params to permit, append them to the sanitizer. # def configure_account_update_params # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) # end # The path used after sign up. # def after_sign_up_path_for(resource) # super(resource) # end # The path used after sign up for inactive accounts. # def after_inactive_sign_up_path_for(resource) # super(resource) # end end
routesを設定する
ここが少し戸惑いました。
devise_for :users, controllers: { registrations: 'users/registrations' }
上記を追加して、registrationsの動作をusers/registartions
に設定します。
次に、アクションをthanksページのroutesを追加します。
devise_scope :user do get 'users/thanks' => 'users/registrations#thanks' end
devise_scope
で設定しないと、request.env[“devise.mapping”]でroutesの設定がされません。
def devise_scope(scope) constraint = lambda do |request| request.env["devise.mapping"] = Devise.mappings[scope] true end constraints(constraint) do yield end end
こんな常識知らないよって感じですが、設定しましょう。
ユーザー登録後のリダイレクト先を変更する
def after_inactive_sign_up_path_for(resource) users_thanks_path end
users/registaration
でコメントアウトされていると思います。
ここに追加すれば終わりです。
まとめ
ドキュメントとソースコードを見よう。