部分的なレイアウトと、yield キーワードを使用してイテレータとしてコード化されたヘルパー メソッドをレールで使用すると、奇妙な動作が見られます。私は誰かができることを願っています:
- 何が起こっているのか、なぜレンダリングが重複するのかを説明してください。
- うまくいけば、リストを返す単純な関数になるようにヘルパー メソッドを再コーディングする以外に、別のアプローチを提案します (暫定的な回避策として既に実行しています)。
したがって、Rails 3 アプリで次の 3 つを作成すると、予期しない出力が得られます。
[更新] 次の組み合わせをテストしました。
Rails 3.0.0 + erb (has this issue)
Rails 3.0.0 + haml (OK)
Rails 3.0.3 + erb (has this issue)
Rails 3.0.3 + haml (OK)
erb と haml の問題かもしれませんが、最初にこれを発見したときは haml テンプレートでした。うーん....何が起こっているのか知っている人はいますか?
A) このようなメイン テンプレート (app/views/main/index.html.erb)
<h1>Main#index</h1>
<p>This is content from main#index before the partial template rendering
<%= render :partial => "partial" %>
<p>This is content from main#index after the partial template rendering.</p>
B) このようなヘルパー メソッド (app/helpers/main_helper.rb)
module MainHelper
def my_iterator
yield 1
yield 2
yield 3
yield 4
end
end
C) このような部分テンプレート (app/views/main/_partial.html.erb)
<% my_iterator do |x| %>
<p>iterator running with <%= x %></p>
<% end %>
ブラウザーで結果を表示すると、「iterator running with」ブロックが合計 8 回表示されます (1 2 3 4 1 2 3 4)。Railsの部分的なテンプレートメカニズムをねじ込む my_iterator 内の歩留まりであると判断しました。my_iterator を次のようにコーディングすると、出力は期待どおりになります。(my_iterator.each を実行するように部分テンプレートを変更する必要もあります)
def my_iterator
logger.debug("my_iterator called")
return [1, 2, 3, 4]
end
これをコーディングして、レールを台無しにしてレンダリングを重複させずに、yield を使用してイテレータとしてヘルパー メソッドをコーディングできるようにする方法はありますか? また、重複したレンダリングがどのように発生するかを誰かが正確に説明できますか?