【问题标题】:Why is Rails' ERB rendering output from this template code?为什么 Rails 的 ERB 会从这个模板代码渲染输出?
【发布时间】:2012-07-14 00:28:08
【问题描述】:

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

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

呈现为:

one

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

编辑

由于似乎有些混乱,这里是一个更接近于我正在调试的实际模板代码的复制:

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

这是呈现为:

    Hello    Hello

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

【问题讨论】:

    标签: ruby-on-rails erb


    【解决方案1】:

    您正在使用rails 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 行被渲染,然后第 5 行被渲染为 my_string 包含值 Hello

    如果你改成这个

     <% my_string = "" %>
     <% my_string = capture do %>  <!-- changed << to = -->
         Hello
     <% end %>
     before <%= my_string %> after
    

    那么结果就是before Hello after

    那么这一切意味着什么?当你使用&lt;&lt; 时,它会搞砸capture 方法,它会渲染捕获块内的内容,尽管通常你不希望它这样做。

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

    【讨论】:

    • 是的,我实际上是将 capture 的返回值附加到另一个字符串中,但为了简化示例,我省略了该细节。
    • 我用一个更好的例子更新了我的原始帖子。是的,我都试过了。
    • @Daniel 好的,我想我明白了
    • 嗯,好的,谢谢。虽然很不幸,因为在我的特殊情况下我需要使用
    • @Daniel 您可以将capture 分配给一个变量,然后再附加到它。如果这回答了您的问题,也将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多