登录失败后设计重定向

Jua*_*njo 55 redirect login ruby-on-rails devise

我发现的所有问题都与帮助者成功登录有关 after_sign_in_path_for(resource)

我在网站的索引中有一个登录表单,当登录失败时,它会重定向到"users/sign_in"

但是,当登录失败时,如何重定向到我的"site #index"?

小智 93

  1. 在lib目录中创建custom_failure.rb,其中包含:

    class CustomFailure < Devise::FailureApp
      def redirect_url
        your_path
      end
    
      def respond
        if http_auth?
          http_auth
        else
          redirect
        end
      end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您设计初始化程序时,包括:

      config.warden do |manager|
        manager.failure_app = CustomFailure
      end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确保Rails在您的application.rb中的lib文件中加载:

    config.autoload_paths += %W(#{config.root}/lib)
    
    Run Code Online (Sandbox Code Playgroud)

不要忘记重新启动服务器.

我认为没有更简单的方法来做到这一点.祝好运.

  • 这对我不起作用,它仍然会重定向回登录 (3认同)
  • 这没用.我知道这是设计维基的库存答案. (2认同)
  • 这对我使用Devise 3.2.4.确保在包含或更改任何重新启动服务器的文件时.您可能会收到如下错误:`NameError - 未定义的局部变量或方法'login'用于#<CustomFailure:0x007ffc4aeb9328>`如果不这样做. (2认同)
  • 在带有 Devise 4.3.0 的 Rails 5 中运行良好。只需将文件 custom_failure.rb 放在 /app/models/concerns 中并跳过 autoload_paths 步骤 #3。谢谢@Marcao,你节省了我的时间! (2认同)

Sib*_*ang 14

如果您使用自己的SessionsController,您可以重新分配:recall值,auth_options以便controller#method在运行前调用您想要的值warden.authenticate!(auth_options),例如:

在app/controllers/users/sessions_controller.rb中

class Users::SessionsController < Devise::SessionsController
  #...
  def create
    #...
    auth_options = { :recall => 'site#index', :scope => :user }
    resource = warden.authenticate!(auth_options)
    #...
  end
  #...
end
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您无需创建自定义的FailureApp并修改配置.


Mik*_*keH 1

您可以更改默认登录路径。

查看https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

  • 你找到答案了吗?我还在寻找…… (4认同)