【问题标题】:Rails render and return in before_action, DoubleRenderErrorRails 在 before_action 中渲染和返回,DoubleRenderError
【发布时间】:2014-08-20 16:23:16
【问题描述】:

在带有 before_action 的控制器动作中,使用 render something and return 实际上不会导致控制器停止执行其余的动作。在我的测试中,只有在控制器操作中被调用时,and return 才能按我的预期工作。

# DoubleRenderError
class SomeController < ApplicationController
    before_filter :double_render, only: [:index]

    def index
        render file: "public/500.html", status: :internal_server_error
    end

    def double_render
        render file: "public/404.html", status: :not_found and return
    end
end

# Renders 404 only, no error
class SomeController < ApplicationController
    def index
        render file: "public/404.html", status: :not_found and return
        render file: "public/500.html", status: :internal_server_error
    end
end

这里发生了什么? before_actions 可以停止控制器的其余执行吗?

【问题讨论】:

  • 自 rails 2.0 以来,过滤器中的渲染/重定向已停止该操作 - 不应调用您的 index 方法
  • 您是否看到与我的示例代码相同的行为?
  • 我之前肯定有过滤器重定向作为结束动作的一种方式

标签: ruby-on-rails ruby-on-rails-4 before-filter


【解决方案1】:

如果您的意图是渲染 404 页面,则不应在 before_filter 中手动渲染它。正确的做法是引发路由错误,如下所示:

raise ActionController::RoutingError.new('Not Found')

您可以实现一个名为“render_404”的方法,在其中引发此异常,然后让路由系统完成其余的工作。

编辑:实际上,您的代码应该可以工作。我真的不知道发生了什么事。我在这里写了同样的东西并且它起作用了——如果 before_filter 渲染了一些东西,则永远不会调用 action 方法。您使用的是什么版本的 Rails?

【讨论】:

  • 我使用的是 Rails 4.1.4。
  • 如果我想在前置过滤器中渲染一个带有自定义错误消息的 json 怎么办? (我正在使用我的控制器作为应用程序的 API 提供程序)
【解决方案2】:

这是一个非常简单的流量控制案例。

是的,当你在 within 方法中and return 时,它显然会返回并且没有到达第二次渲染。

before_filter 内渲染并不意味着停止对操作本身的实际调用,从before_filter 调用and return 不会影响完全独立的方法调用的执行。

这是纯粹的 Ruby 流控制,不涉及 Rails 魔法。

【讨论】:

  • 我也很怀疑。了解我要完成的工作,您能否提供一些指导?
  • 查看其他答案。引发异常而不是呈现错误。
猜你喜欢
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2015-01-31
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多