为什么Rails的ERB渲染输出来自此模板代码?

时间:2012-07-14 00:28:08

标签: ruby-on-rails erb

我正在使用Rails 3.0.3和以下模板(扩展名为.html.erb):

<% "one"; "two"; capture do %>
    Three
<% end %>

呈现为:

one

这是为什么?它似乎不应该渲染任何东西,因为我没有使用&lt;%=

修改

由于似乎存在一些混淆,这里的复制品更像是我正在调试的实际模板代码:

<% my_string = "" %>
<% my_string << capture do %>
    Hello
<% end %>
<%= my_string %>

这呈现为:

    Hello    Hello

由于某种原因,捕获的输出被附加到my_string并被渲染,而不仅仅是前者。

1 个答案:

答案 0 :(得分:0)

您使用的是导轨capture helper,但语法错误。我不知道为什么打印one。在rails 3.4中,它不打印任何内容。

这是使用它的正确方法

<% @number = capture do %>
   three
<% end %>

this is some html and here is my <%= @number %>

将呈现的html是

this is some html and here is my three

由于你的语法错误,我不担心为什么会出现“one”。相反,我会更专注于正确使用捕获助手。

<小时/> 修改

您的第二个(已编辑)示例与您的第一个示例不同。这里是行号和最后一行的细微变化,这样你就可以看到发生了什么。

1. <% my_string = "" %>
2. <% my_string << capture do %>
3.     Hello
4. <% end %>
5. before <%= my_string %> after

结果是Hello before Hello after。因此正在渲染第3行,然后使用包含值my_string的{​​{1}}呈现第5行。

如果您将其更改为

Hello

然后结果为 <% my_string = "" %> <% my_string = capture do %> <!-- changed << to = --> Hello <% end %> before <%= my_string %> after

那么这一切意味着什么呢?当你使用before Hello after时,它正在搞砸<<方法并且它正在渲染捕获块内的东西,即使你通常不期望它。

基本上,你不能做你想做的事,至少不能用你当前的语法。