Rails,Devise:FailureApp中的DoubleRenderError

时间:2017-02-19 12:44:17

标签: ruby-on-rails ruby redirect devise ruby-on-rails-5

我正在尝试配置Devise,以便每当用户未确认帐户登录时,他都会被重定向到new_confirmation_path。 这是我到目前为止所得到的:

LIB / custom_failure.rb

class CustomFailure < Devise::FailureApp
    def redirect_url
        if warden_message == :unconfirmed
            redirect_to new_user_confirmation_path(q: "unconfirmed")
        else
            super
        end
    end
    def respond
        if http_auth?
            http_auth
        else
            redirect
        end
    end
end

配置/ application.rb中

config.autoload_paths << Rails.root.join('lib')

配置/初始化/ devise.rb

config.warden do |manager|
    manager.failure_app = CustomFailure
end

不幸的是,每当用户尝试登录时,我都会收到以下错误:

  

AbstractController :: Users中的DoubleRenderError :: SessionsController #create

  在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每次操作最多一次。另请注意,重定向和渲染都不会终止执行操作,因此如果要在重定向后退出操作,则需要执行类似“redirect_to(...)并返回”的操作。

  lib / custom_failure.rb中的错误(第15行附近)

我遵循了Devise Wiki Page

1 个答案:

答案 0 :(得分:1)

如错误所述,您正在执行双重渲染(渲染或重定向)。我想这与你的redirect_url方法直接相关。

查看devise's wiki,在覆盖redirect_url方法时无需执行重定向。此外,通过检查devise's failure code,在失败的请求结束时,您的应用程序正在执行此操作:

redirect_to(redirect_url)
# Which is equal to
redirect_to(redirect_to(new_user_confirmation_path(q: "unconfirmed")))

哪个错了。要解决此问题,请在redirect_url覆盖中仅指定网址而不是重定向:

class CustomFailure < Devise::FailureApp
  def redirect_url
    if warden_message == :unconfirmed
      # Remove the `redirect_to` call
      new_user_confirmation_path(q: "unconfirmed")
    else
     super
    end
  end

  # ...
end