【发布时间】:2018-04-26 05:17:42
【问题描述】:
class SomeController < ApplicationController
before_action :api_limit
def new
if user.can_access_foo?
render 'foo'
end
if user.can_access_bar?
render 'bar'
end
if user.can_access_hello?
render 'hello'
end
end
def api_limit
render 'exceed_limit_error'
# code in action will not be executed.
end
end
当render或redirect_to存在于before_filter时,action不会被执行。总之,不存在双重渲染的风险。
如果“之前”过滤器呈现或重定向,则该操作将不会运行。如果有其他过滤器计划在该过滤器之后运行,它们也会被取消。
但是,为什么 Rails 允许在一个动作中进行双重渲染?
以下面的代码为例。当用户可以访问 foo、bar 或 hello 时,Rails 将引发双重渲染异常。
class SomeController < ApplicationController
before_action :callback
def new
if user.can_access_foo?
render 'foo'
# From my understanding, following render should
# be ignored if this step is successfully performed.
end
if user.can_access_bar?
render 'bar'
end
if user.can_access_hello?
render 'hello'
end
end
end
为什么不立即响应并在render 'foo' 完成时停止请求周期?这听起来更合理。
【问题讨论】:
-
“为什么 Rails 允许在一个动作中进行双重渲染?” - 也许你应该问问 Rails Core 团队。
-
我认为第二个
render会引发错误。但是,要回答您的问题,Rails 不能跳出您的方法,例如引发异常,因为这将放弃任何等待运行的非render行。 -
因为渲染!=返回。只需对这些情况使用保护子句
-
好点@Philip - 您可能希望在渲染后在控制器中运行更多代码,但是 before_action 回调不让动作运行似乎不一致。
标签: ruby-on-rails ruby rendering