我在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_datetime
和time_description
不能從ERB功能內部訪問。
我知道,功能render_article
不會被調用,因爲如果我改變它的簽名,以去除參數,我得到一個錯誤
wrong number of arguments (given 1, expected 0)
# (erb):45:in `render_article'