当使用带有部分布局的rails以及使用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)。我已经确定它是 my_iterator 中的 yield 与 rails 部分模板机制有关。如果我对 my_iterator 进行如下编码,则输出与我预期的一样。(我还需要更改我的部分模板来执行 my_iterator.each)
def my_iterator
logger.debug("my_iterator called")
return [1, 2, 3, 4]
end
有没有办法对此进行编码,这样我就不会使用rails并获得重复的渲染,但仍然可以使用yield将辅助方法编码为迭代器?另外,有人可以准确解释重复渲染是如何发生的吗?