2017-03-07 5 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 %> 

私はhtmlのが私のRubyコードを乱雑にするものではなく、テンプレートにrender_articleを定義しているといいだろうと思いました。しかし、関数内でそのコードを移動すると、エラーが発生します。

これは、関数である:

<% 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の機能を使用できません"あなたが期待するものとは異なる)。

これを行うための「railsy」方法は、ヘルパーを追加することまたはpartialを使用することですが、両方とも欠点があります。 .erb(ほとんどのテンプレート言語のように)ファイルは「うまく機能しません」。あなたが幾分より自由に物事を要因にしたい場合は、fortitude gemを見てください。これは、基本的には、htmlのための基本的にruby -DSLです。しかし、それはおそらくあなたが慣れ親しんだものからのかなり劇的な変化です。

あなたが本当に.erb -file内部のメソッドを定義したい場合は、あなたがあなたのparamsへのみアクセスする必要があります<% ... %>ブラケットの単一ペア内に完全にそれをしなければならないだろう、ないあなたコンテキスト。あなたは<%= ... %>でそれを使用できるようにするために、基本的にはStringを返さなければならないでしょうし、すべてを徹底的に逃れるためのルールをエスケープすることに多くの注意を払ってください。これはおそらくそれが価値があるよりも多くのトラブルです(ただし、fortitude :-)で行うのは簡単です)。

関連する問題