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