有没有办法从Rails中的视图提前退出或“返回”?

时间:2013-06-24 18:17:07

标签: ruby-on-rails ruby-on-rails-3

Rails是否提供任何方法可以提前退出或从正在呈现的视图中“返回”?

例如,我有一个结构如下:

<h1>Your records summary</h1>

<% if @current_user.has_records? %>
  <p>You don't have any records.</p>
<% else %>
  ... long block of view emission code here ...
<% end %>

在非erb代码中,我只是来自return条件的if,并且不需要将该长块放在else内。它看起来像是:

<h1>Your records summary</h1>

<% if @current_user.has_records? %>
  <p>You don't have any records.</p>
  <% return (or something) %>
<% end %>
... long block of view emission code here ...

有没有办法在erb中做类似的事情?

编辑:要明确,我不是要求替代方法,例如已被建议过。我不是Rails noob。我真的只想知道Ruby是否提供了我建议与否的机制。

4 个答案:

答案 0 :(得分:4)

IIRC没有提前退出模板的内置机制。这与(我认为)视图层的行为方式一致,尽管erb不是一个模板引擎。

旧的解决方案是将模板包装在catch中并从模板中抛出一些东西,如符号。

您还可以将eval嵌入lamba中,允许return工作。

但是,仍然是。

答案 1 :(得分:4)

在Rails 3.2.2中,返回模板内部对我来说效果很好。

<% return unless allowed_tags %>

答案 2 :(得分:3)

这是一个古老的问题,但我想我会花时间让未来的人们在一小时左右的生活中试图弄清楚这是否可行。

我发现,早在Rails 3.2,这实际上是可能的。

它需要一些ActionView内部知识,我提倡任何人在生产代码中执行此操作。此外,这个特定的实现仅适用于Rails使用的内置ERB引擎,它本身使用Erubi。

好吧,既然我们已经完成了警告,那就行动了!

令人惊讶的简单回答是return @output_buffer.to_s

只要您在返回之前关闭了所有HTML标记,它就会正常工作并且所有内容都会正确呈现。

好奇的是,此输出缓冲区当前在Erubi ERB handler的初始值设定项中配置。其余的工作由基础Erubi::Engine implementation完成。

我已经开辟了一些提供早期返回的不那么脆弱的方法,但到目前为止我都没有成功。

答案 3 :(得分:2)

最好的方法是在渲染模板之前处理控制器中的条件。在那里,您可以提前return使用不同的模板(如“添加记录”表单)或结果模板。

您还可以在视图中将该逻辑卸载到Javascript。