web-dev-qa-db-ja.com

Devise before_filter:authenticate_userをリダイレクトしてパスにサインインします

私はdeviseを使用していて、簡単な質問があります。 :authenticate_userをリダイレクトするにはどうすればよいですか?サインインする代わりに、ユーザーのサインアップページにbefore_filter?私は https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb を経験してきましたが、解決策を見つけるのにあまり運がありませんでした。

24
Glenn

ここに示すように、DeviseのFailureAppを継承するカスタムFailureAppを作成する必要があります: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific -page-when-the-user-can-not-be-authenticated

10
Steve

ユーザーがログインしていない場合にサインアップにリダイレクトする必要があるという同様の問題がありました。application_controller.rbにメソッドを追加し、他のコントローラーでbeforeフィルターとして使用することで修正しました。

これは、デバイスの抽象化の束をスキップするため、一時的な解決策であることに注意してください。


before_filter :auth_user

  def auth_user
    redirect_to new_user_registration_url unless user_signed_in?
  end
44
Baconator507

失敗したアプリでこれを行う正しい方法を示すwikiページを追加しました(Stevenが最初に示唆したように):

重要なのは、次のようにrouteメソッドをオーバーライドすることです。

# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
  def route(scope)
    :new_user_registration_url
  end
end

次に、Deviseに障害アプリを使用させます。

# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = MyFailureApp
end

このアプローチは、コントローラーでauthenticate_user!をオーバーライドするよりも望ましい方法です。これは、サインインに成功した後にユーザーをリダイレクトできるように、試行されたURLを保存するなど、Deviseが行う多くの「舞台裏」を覆い隠すことがないためです。

複数のユーザータイプの場合

AdminおよびUser Deviseリソースがある場合は、管理者向けのデフォルトの「新しいセッション」機能を維持することをお勧めします。処理されているスコープのタイプを確認することで、これを非常に簡単に行うことができます。

# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
  def route(scope)
    scope.to_sym == :user ? :new_user_registration_url : super
  end
end
0
Kyle Fox