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

Gra*_*ier 15 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 %>
Run Code Online (Sandbox Code Playgroud)

在非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 ...
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*all 9

这是一个老问题,但我想我会花时间让未来的人们花上一个小时左右的时间来弄清楚这是否可行。

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

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

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

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

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

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

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


小智 7

在 Rails 3.2.2 中,模板内的 return 对我来说很好用。

<% return unless allowed_tags %>
Run Code Online (Sandbox Code Playgroud)

  • @Gerry,在执行 return 的情况下,不会呈现 return 语句之前的标记。 (6认同)

Dav*_*ton 5

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

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

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

不过还不错。

  • 使用 try/catch 的想法有点搞笑。 (2认同)