web-dev-qa-db-ja.com

deviseafter_sign_up_path_forが機能しない場合のオーバーライド

ルートには"home#index"を指すルートパスがありますが、それをafter_sign_up_path_forでオーバーライドしようとすると、サインインまたはサインアップ時にルートパスにリダイレクトされ続けます。 deviseサブクラスコントローラーとapplication_controllerの両方に入れようとしましたが、機能しませんでした。ここで何をする必要がありますか?

アプリケーションコントローラー

class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_up_path_for(resource)
    show_cities_path(resource)
  end
end

登録コントローラー

class RegistrationsController < ApplicationController
  def after_sign_up_path_for(resource)
    show_cities_path(resource)
  end
end

ルート

root :to => "home#index"
23
katie

rake routesを実行して、show_cities_pathが存在することを確認しましたか?一見の価値があるかもしれません https://github.com/plataformatec/devise/wiki/How-To:-Change-the-redirect-path-after-destroying-a-session-ie-signing- out

6
Elliot

また、Confirmableモジュールを有効にしている場合は、新しいサインアップが確認されるまで「非アクティブ」であるため、after_inactive_sign_up_path_forをオーバーライドする必要があります。 after_sign_up_path_forは、Confirmableがアクティブなときに呼び出されないようです。

82
Ryan McCuaig

ゲームに遅れましたが、この問題に遭遇し、解決策を見つけるのに苦労しました。

独自のRegistrationsControllerを使用してDeviseをカスタマイズしている場合は、ApplicationControllerではなくafter_sign_up_path_for(resource)メソッドをそのコントローラーに追加する必要があります。

Registrations_controller.rb内:

private

  def after_sign_up_path_for(resource)
    new_page_path
  end

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

14
Ryan Francis

Deviseの登録コントローラーをオーバーライドしていることを宣言するのを忘れていたことに気付くまで、この問題に苦労しました。私の場合、:userリソースでdeviseを使用しているので、これをroutes.rbに追加しました。

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

その後、after_inactive_sign_up_path_forで指定したリダイレクトが機能しました。

オーバーライドデバイス登録コントローラー は、オーバーライドを宣言する別の方法で、このトピックに関するより完全な議論をしています。

7
Andy R.

私はこれで約2時間吹き飛ばしましたが、LiveReloadが私の問題でした。私は正常にリダイレクトされていましたが、LiveReloadはdevelopment.sqlliteの変更を取得し、リクエストをオーバーライドしていました。

0
Adam Waite

Rails 5.2:でOmniAuthカスタムコールバックコントローラーを使用する場合:

私の特定のケースでは、サインアップ後のパスが機能していませんでした。しかし、カスタムコールバックコントローラーでOmniAuthを使用していました。これは、前者ではなくafter_sign_in_path_forを呼び出していました。

def google_oauth2 @user = User.from_omniauth(request.env ["omniauth.auth"])

if @user.persisted?
  # Here's the guilty line your honour:
  sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated
  set_flash_message(:notice, :success, kind: "Google") if is_navigational_format?
else
  session["devise.google_oauth2_data"] = request.env["omniauth.auth"]
  redirect_to new_user_registration_url
end

終わり

........そして、sign_in_and_redirectパスはafter_sign_in_path_forメソッドにリダイレクトされます。そこで、セッション用の新しいデバイスコントローラーを生成し、そのメソッドを単純にオーバーライドしました。問題が解決しました!

0
BKSpurgeon

実際、問題を解決するためにdeviseのソースコードを見ることができ、それは簡単です。

devise-3.4.1 $ vim app/controllers/devise/registrations_controller.rb

  # POST /resource
  def create
    build_resource(sign_up_params)

    resource_saved = resource.save
    yield resource if block_given?
    if resource_saved
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      @validatable = devise_mapping.validatable?
      if @validatable
        @minimum_password_length = resource_class.password_length.min
      end
      respond_with resource
    end
  end

コードが示すように:

      if resource.active_for_authentication?
        ...
        respond_with resource, location: after_sign_up_path_for(resource)

      else
        ...
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
0
yanyingwang