2017-03-07 6 views
0

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' 

Antwort

1

Was Sie versuchen zu tun ist technisch nicht unmöglich, aber sehr schwierig und nicht zu empfehlen, da kann durch Lesen von Kommentaren und Antworten zu this question gesehen werden.

Wie Ihre Fehlermeldung darauf hinweist, dass Ihr def nicht ganz in dem Kontext passieren wird, den Sie "wahrscheinlich" erwarten, und Sie werden sicherlich "erb features" bei der Definition der Methode nicht frei verwenden können (da Ihr Kontext vollständig ist anders als das, was Sie erwarten).

Der "railsy" Weg, dies zu tun ist Hinzufügen eines Helfers oder mit einem partial, aber beide kommen mit ihren Nachteilen. .erb Dateien (wie die meisten Templating-Sprachen) nicht gut "Faktor". Wenn Sie die Dinge etwas mehr Faktor einbeziehen möchten, sollten Sie sich die fortitude gem ansehen, die bietet, was im Grunde eine ruby-DSL für HTML ist, die ziemlich einfach Faktoren. Dies ist jedoch eine ziemlich drastische Änderung von dem, was Sie wahrscheinlich gewohnt sind.

Wenn Sie wirklich ein Verfahren innerhalb eines .erb -Dateien definieren wollen, dann würden Sie es tun müssen vollständig in einem einzigen Paar von <% ... %> Klammern, wo Sie nur Zugriff auf Ihre params haben, nicht Ihre Kontext. Sie müssten zurückgeben, was im Grunde ein String ist, um es in <%= ... %> verwenden und eine Menge Aufmerksamkeit auf die Regeln für alles, um es durch zu gehen. Dies ist wahrscheinlich mehr Mühe als es wert ist (aber einfach genug zu tun in fortitude :-).

Verwandte Themen