18

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 菜鸟。我真的只是想知道 Ruby 是否为我的建议提供了一种机制。

4

4 回答 4

9

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

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

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

好的,现在我们已经完成了警告,开始行动!

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

只要您在返回之前关闭了所有 HTML 标记,它似乎就可以工作并且一切都正确呈现。

出于好奇,此输出缓冲区当前在Erubi ERB 处理程序的初始化程序中配置。其余工作由底层Erubi::Engine 实现完成。

我已经探索了一些可以提供一种不那么脆弱的提早返回方式的方法,但到目前为止我还没有成功。

于 2018-05-29T19:24:07.973 回答
7

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

<% return unless allowed_tags %>
于 2015-09-24T14:47:10.380 回答
5

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

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

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

不过,还是。

于 2013-06-24T19:37:02.970 回答
2

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

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

于 2013-06-24T18:23:52.540 回答