Rails渲染并返回before_action,DoubleRenderError

bro*_*ney 1 ruby-on-rails before-filter ruby-on-rails-4

在具有before_action的控制器操作中,using 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
Run Code Online (Sandbox Code Playgroud)

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

Vic*_*tor 6

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

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

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

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