Deviseで確認後リダイレクトを作成するにはどうすればよいですか?
confirmation module
を追加する前に、カスタムafter_sign_up_path
が初めて正常に機能しましたlogin/signup
が、メールの確認リンクをクリックすると、ログイン後のパスに設定したパスにリダイレクトされます(ユーザープロファイル)。
ここでの私の目標は、フォームウィザードと「入門」ページを作成して追加情報を収集することです。明らかな警告は、このリダイレクトは確認時に1回しか発生しないことです。
スタックに投稿された他のソリューションをいくつか試しましたが、どれも動作しないようです。
基本的に、Devise ConfirmationsControllerの次の行を変更します。
そのため、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
メソッド。したがって、別のオプションとして、そのメソッドが返すものを変更できます。
これを達成するためのそれほど邪魔にならない方法は、after_confirmation_path_for
のDevise::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サーバーを再起動すると、必要になります。
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" }
@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" }
私はこのすべてを終えたばかりで、他の答えはどれもうまくいきませんでした(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