Rails渲染并返回before_action,DoubleRenderError

时间:2014-08-20 16:23:16

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

在具有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可以停止控制器执行的其余部分吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

编辑:实际上,您的代码应该有效。我真的不知道发生了什么。我在这里写了同样的东西并且它有效 - 如果before_filter呈现某些东西,则永远不会调用action方法。您使用的是哪个版本的Rails?

答案 1 :(得分:1)

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

是的,当您从 方法中and return时,它显然会返回并且无法到达第二个渲染。

before_filter内部渲染的任何内容都不是要停止实际调用操作本身,而从and return调用before_filter并不会影响完全执行单独的方法调用。

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