web-dev-qa-db-ja.com

確認後にリダイレクトを考案する

Deviseで確認後リダイレクトを作成するにはどうすればよいですか?

confirmation moduleを追加する前に、カスタムafter_sign_up_pathが初めて正常に機能しましたlogin/signupが、メールの確認リンクをクリックすると、ログイン後のパスに設定したパスにリダイレクトされます(ユーザープロファイル)。

ここでの私の目標は、フォームウィザードと「入門」ページを作成して追加情報を収集することです。明らかな警告は、このリダイレクトは確認時に1回しか発生しないことです。

スタックに投稿された他のソリューションをいくつか試しましたが、どれも動作しないようです。

41
js111

基本的に、Devise ConfirmationsControllerの次の行を変更します。

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L25

そのため、showアクションをオーバーライドする必要があります。 showアクションの「if」ステートメントのハッピーパスを心ゆくまで修正するだけです。

class ConfirmationsController < Devise::ConfirmationsController
  def new
    super
  end

  def create
    super
  end

  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to confirmation_getting_started_path }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
    end
  end
end

そして、そのスコープ付きルート(ビューとアクションを登録コントローラーに入れますが、何にでも変更できます):

devise_for :users, controllers: { confirmations: 'confirmations' }
devise_scope :user do
  get '/confirmation-getting-started' => 'registrations#getting_started', as: 'confirmation_getting_started'
end

デフォルトのshowアクションは、保護されたafter_confirmation_path_forメソッド。したがって、別のオプションとして、そのメソッドが返すものを変更できます。

19
Lee Smith

これを達成するためのそれほど邪魔にならない方法は、after_confirmation_path_forDevise::ConfirmationsControllerメソッドをオーバーライドすることです。

confirmations_controller.rbディレクトリに新しいapp/controllersを作成します。

class ConfirmationsController < Devise::ConfirmationsController

  private

  def after_confirmation_path_for(resource_name, resource)
    your_new_after_confirmation_path
  end

end

config/routes.rbで、この行を追加して、DeviseがカスタムConfirmationsControllerを使用するようにします。これはDeviseがusersテーブルで動作することを前提としています(自分のテーブルに合わせて編集できます)。

devise_for :users, controllers: { confirmations: 'confirmations' }

Webサーバーを再起動すると、必要になります。

126
MichaelZ

Devise wiki を確認しましたか? after_signup_path_forがあなたのケースで定義するパスで、これを行う方法を説明します。

ウィキから:

新しいコントローラーRegistrationsControllerを作成します。

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    '/an/example/path'
  end
end

そして、それを使用するルートを追加します。

devise_for :users, :controllers => { :registrations => "registrations" }
19
niels

@Lee Smithによって提供されたソリューションは完全に機能していますが、少し追加します。つまり、この場合はDevise確認コントローラーをオーバーライドしながら新しいアクションを作成してアクションを作成する必要はありませんです。 。

次のように:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to your_desired_redirect_path }
    else
      respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new }
    end
  end
end

次に、ルートファイルで、確認コントローラーのルーティングを追加します。

 devise_for :users, controllers: { confirmations: "confirmations" }
2

私はこのすべてを終えたばかりで、他の答えはどれもうまくいきませんでした(2015-04-09 with devise 3.4.1)。

私が望んでいたのは、サインアップ後、ユーザーが確認メールに関するメッセージとともにログインページにリダイレクトされることでした。これを機能させるために、私がしなければならないことは次のとおりです。

class RegistrationsController < Devise::RegistrationsController

protected
  # This is the method that is needed to control the after_sign_up_path 
  # when using confirmable. 
  def after_inactive_sign_up_path_for(resource)
    new_user_session_path
  end

end

編集:私はちょうど私がはるかに早くする必要がある正確に私を送っただろうこのコメントを見つけました。

Nielsに言及しているafter_inactive_sign_up_path_forへの参照を次に示します。 Devise wiki – marrossa 12年11月13日3:38

2
Karl Wilbur