Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么渲染和重定向在Rails应用程序中不停止执行?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 4_Actioncontroller - Fatal编程技术网

Ruby on rails 为什么渲染和重定向在Rails应用程序中不停止执行?

Ruby on rails 为什么渲染和重定向在Rails应用程序中不停止执行?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,actioncontroller,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Actioncontroller,我有一个用例问题。在Rails4.1中,如果您运行一个控制器方法,并且在方法中的某个点将_重定向到或呈现,那么您仍然可以在该点继续执行。如果不能正确处理控制流,有时会导致AbstractController::DoubleRenderError。为什么Rails中允许这样做?重定向而不是停止执行似乎是一个有趣的用例,什么时候合适 下面列出了完整的错误消息: AbstractController::DoubleRenderError: Render and/or redirect

我有一个用例问题。在Rails4.1中,如果您运行一个控制器方法,并且在方法中的某个点将_重定向到或呈现,那么您仍然可以在该点继续执行。如果不能正确处理控制流,有时会导致AbstractController::DoubleRenderError。为什么Rails中允许这样做?重定向而不是停止执行似乎是一个有趣的用例,什么时候合适

下面列出了完整的错误消息:

  AbstractController::DoubleRenderError:
       Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

实际上,错误消息说明了这一切:

请注意,您只能调用render或redirect,每个操作最多只能调用一次。还请注意,重定向和render都不能终止操作的执行,因此,如果您想在重定向后退出操作,您需要执行类似“重定向到(…)并返回”的操作

这是Rails的默认行为

如果尝试在单个操作中渲染多个视图,则会出现
AbstractController::DoubleRenderError
错误


要在渲染后停止执行,必须显式使用
return
语句。

对,对不起,我猜我说错了。我知道错误的存在以及一切,我只是好奇为什么会存在这个实现。比如,在渲染/重定向时结束执行而不是抛出异常,这难道没有意义吗?为什么轨道设计成这样?是的,这是一个设计问题。我认为您应该在rails核心团队问题讨论中问这个问题;)正如下面提到的,问问Rails核心团队,他们是唯一能够提供权威答案的人。在他们开口之前,我们不能确定。一般来说,Ruby可以使用
返回
抛出
(或
提升
,但这是错误)来中断执行,因此它也被证明是一个有效的选择。