【问题标题】:Rails, Devise: DoubleRenderError in FailureAppRails,设计:FailureApp 中的 DoubleRenderError
【发布时间】:2017-02-19 12:44:17
【问题描述】:

我正在尝试配置 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

config/application.rb

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

config/initializers/devise.rb

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

很遗憾,每当用户尝试登录时,我都会收到以下错误:

AbstractController::DoubleRenderError in Users::SessionsController#create

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

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

我关注了这个Devise Wiki Page

【问题讨论】:

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


    【解决方案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 覆盖中仅指定 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多