2012-07-14 20 views
0

我使用Rails 3.0.3,以及下面的模板(帶有擴展.html.erb):爲什麼Rails的這個模板代碼的ERB呈現輸出?

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

正在呈現爲:

one 

這是爲什麼?它似乎並不像它應該呈現什麼,因爲我沒有使用<%=

編輯

因爲似乎有一些混亂,這裏要說的是更接近實際的模板代碼再現那我調試:

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

這是作爲渲染:

Hello Hello 

由於某種原因,捕獲的輸出被追加到my_st環和呈現,而不是隻是前者。

回答

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 

因爲你的語法錯了,我不會擔心,爲什麼「一個」被顯示出來。相反,我會更專注於正確使用捕獲助手。


編輯:

你的第二個(編輯)的例子是不一樣的你的第一個。這裏是行號和最後一行的輕微改變,所以你可以看到發生了什麼。

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

那麼這是什麼意思?當你使用<<時,它會搞砸capture方法,即使通常你不指望它,它也會渲染捕獲塊內的東西。

基本上,你不能在這裏做你想做的事情,至少不能用你當前的語法。

+0

是的,我實際上追加捕獲的返回值到另一個字符串,但我省略了詳細信息,以簡化我的示例。 – Daniel 2012-07-14 00:49:10

+0

你有沒有試過你在rails 3.0.3中發佈的確切的erb? – Dty 2012-07-14 00:50:45

+0

我用一個更好的例子更新了我原來的帖子。是的,我已經嘗試了兩種。 – Daniel 2012-07-14 00:57:29