login失败后deviseredirect

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

我在网站的索引中有一个login表单,当login失败时,它redirect到“users / sign_in”

但是,如果login失败,我怎么能redirect到我的“网站#索引”?

  1. 在你的lib目录下创build一个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 
  2. 在你devise初始化器时,包括:

      config.warden do |manager| manager.failure_app = CustomFailure end 
  3. 确保Rails在您的application.rb中加载到您的lib文件中:

     config.autoload_paths += %W(#{config.root}/lib) 

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

我不认为有一个更简单的方法来做到这一点。 祝你好运。

如果使用自己的SessionsController ,则可以在运行warden.authenticate!(auth_options)之前重新指定auth_options :recall值以调用所需的controller#method ,例如:

在应用程序/控制器/用户/ sessions_controller.rb

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

通过这种方式,您不需要创build自定义的FailureApp并修改configuration。

这是devise3.1.0发生的事情

 Started POST "/users/sign_in" Processing by Devise::SessionsController#create Completed 401 Unauthorized Processing by Devise::SessionsController#new 

由于在gems / devise-3.1.0 / app / controllers / devise / sessions_controller.rb中定义的auth_options而调用了新的get

您应该重新定义创build操作中使用的auth_options。 我将控制器复制到我的Rails应用程序的app / controllers / devise / sessions_controller.rb中,并replace了这样的auth_options方法

 def auth_options { :scope => resource_name, :recall => "Home#new" } end 

它的窍门,但url仍然是/用户/ sign_in

我会尽力解决这个问题。

在Marcao的回答中,我强烈build议在CustomFailure响应方法中放置一些debugging器 ,以便更好地理解正在发生的事情。

 Class CustomFailure < Devise::FailureApp def respond binding.pry super end end 

如果您查看FailureApp Devise源代码的响应方法,则很容易理解正在发生的事情。

 def respond if http_auth? http_auth elsif warden_options[:recall] recall else redirect end end 

因此,例如为了返回一个redirect_url,你会想确保你的respond代码条件最终返回redirect

但是,如果您想要返回http_auth方法中定义的标准401状态,则需要validation您的respond方法代码是否返回http_auth

因此,值得一看http_auth?的定义http_auth? 特别注意: request.xhr? 方法,这将返回0的JSON请求(回想0实际上在ruby评估为真)

 def http_auth? if request.xhr? Devise.http_authenticatable_on_xhr else !(request_format && is_navigational_format?) end end 

也许检查你的初始化/devise文件config.http_authenticatable_on_xhrconfig.navigational_formats为了控制你想要的响应。 这个configuration实际上可以影响Devise返回的结果,并且通常会导致意外的行为,这是由于它在这里所做的。