Ich habe dieses Stück Code in ERB Vorlage, um alle Artikel in der Liste zu rendern.Wie man ERB Templating Code in Funktion wiederverwenden kann?
<% @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 %>
Jetzt werde ich es so etwas ändern muß:
dachte<% @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 %>
ich, es wäre schön render_article
in Vorlage mit HTML-Krempel meines Ruby-Code im Gegensatz definiert zu haben. Aber wenn ich diesen Code in die Funktion verschiebe, bekomme ich einen Fehler.
Dies ist die Funktion:
<% 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 %>
Dies ist der Fehler:
undefined local variable or method `_erbout' for #<Html::FrontPage:0x0055fb94005c68>
Codezeile diesen Fehler erzeugt ist:
self.class.instance_variable_get(:@renderer).result(binding)
Warum ist das passiert? Wie finde ich einen informativeren Fehler?
Wie behebt man das? Kann ich es vermeiden, diesen offensichtlich html-dominanten Code in die Ruby-Hilfsdatei zu verschieben?
PS. Ich vermute, dass das Problem ist, dass die Funktionen to_datetime
und time_description
nicht von innerhalb der ERB-Funktion zugegriffen werden können.
weiß ich, dass Funktion render_article
nicht, weil aufgerufen, wenn ich es Signatur ändern Parameter zu entfernen, erhalte ich einen Fehler
wrong number of arguments (given 1, expected 0)
# (erb):45:in `render_article'