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の設定がされません。

https://github.com/plataformatec/devise/blob/88724e10adaf9ffd1d8dbfbaadda2b9d40de756a/lib/devise/rails/routes.rb#L361

    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でコメントアウトされていると思います。

ここに追加すれば終わりです。

まとめ

ドキュメントとソースコードを見よう。