我正在使用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并被渲染,而不仅仅是前者。
答案 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
时,它正在搞砸<<
方法并且它正在渲染捕获块内的东西,即使你通常不期望它。
基本上,你不能做你想做的事,至少不能用你当前的语法。