2017-03-07 47 views
0

我在ERB模板裏面有這段代碼來呈現列表中的所有文章。如何在函數中重用ERB模板代碼?

<% @list.each do |a| %> 
    <article class="my-panel"> 
     <header> 
     <h2><a href="<%= rel_url_to a[:rel_url] %>"><%= a[:name] %></a></h2> 
     <time datetime="<%= to_datetime(a[:time]) %>"><%= time_description(a[:time]) %></time> 
     </header> 
     ... more stuff cut out 
    </article> 
    <% end %> 

現在我將不得不改變它的東西是這樣的:

<% @list[content_splitter.before_ad_range].each do |a| %> 
    <%= render_article(a) %> 
<% end %> 

<%= AdCreator.between_content_ad %> 

<% @list[content_splitter.after_ad_range].each do |a| %> 
    <%= render_article(a) %> 
<% end %> 

我認爲這將是不錯的模板定義render_article,而不是讓HTML弄亂我的Ruby代碼。但是當我將這些代碼移到函數中時,我得到一個錯誤。

這是函數:

<% def render_article(a) %> 
    <article class="my-panel"> 
     <header> 
     <h2><a href="<%= rel_url_to a[:rel_url] %>"><%= a[:name] %></a></h2> 
     <time datetime="<%= to_datetime(a[:time]) %>"><%= time_description(a[:time]) %></time> 
     </header> 

     <div class="image"> 
     <a href="<%= rel_url_to a[:rel_url] %>"><img alt="" src="<%= rel_url_to a[:img_url_1x] %>" srcset="<%= rel_url_to a[:img_url_2x] %> 2x, <%= rel_url_to a[:img_url_3x] %> 3x"></a> 
     </div> 

     <div class="text"> 
     <%= a[:article_text] %> 
     </div> 
    </article> 
    <% end %> 

這是錯誤:

undefined local variable or method `_erbout' for #<Html::FrontPage:0x0055fb94005c68> 

的產生這個錯誤代碼行是:

self.class.instance_variable_get(:@renderer).result(binding) 

這究竟是爲什麼?如何找到更多信息錯誤?

如何解決這一問題?我可以避免將這個明顯的html主導代碼移到ruby幫助文件中嗎?

PS。我懷疑問題是功能to_datetimetime_description不能從ERB功能內部訪問。

我知道,功能render_article不會被調用,因爲如果我改變它的簽名,以去除參數,我得到一個錯誤

wrong number of arguments (given 1, expected 0) 
# (erb):45:in `render_article' 

回答

1

你所試圖做的是不是技術上不可能,而是很難,不推薦作爲可以通過閱讀評論和this question的答案看到。

由於您的錯誤消息指出您的def將不太會發生在你「可能」預期的背景下,你一定會不能夠「自由使用erb功能」而定義的方法(因爲你的背景是完全與你期望的不同)。

「這樣做」的方式是添加一個幫手或使用partial,但兩者都有其缺點。 .erb文件(與大多數模板語言一樣)不能很好地「考慮因素」。如果你想更自由地考慮事情,你應該看看fortitude gem,它提供了基本上是HTML的ruby -DSL,這很容易。然而,這是一個從你可能習慣的劇烈變化。

如果你真的定義一個.erb -file內的方法,那麼你就必須單對<% ... %>括號那裏你將有訪問您的PARAMS內完全做到這一點,你上下文。你將不得不返回基本上是String的內容,以便能夠在<%= ... %>中使用它,並付出許多注意力去逃避規則,使所有事情都能通過。這很可能比它的價值更麻煩(但在fortitude :-)中很容易做到。