如何使用参数迭代Rails助手中的已产生块

时间:2012-05-23 21:04:41

标签: ruby-on-rails block yield helpers

我想将某个逻辑抽象为视图助手。我的想法是能够在我看来做这样的事情:

<ul class="nav">
  <% pages_for_section('over') do |page| %>
    <li><%= page.menu_text %></li>
  <% end %>
</ul>

我目前的做法是像这样制作这个帮手:

def pages_for_section(section_slug, &block)
  out = []

  pages_in_section = @pages.select { |p| p.section.slug == section_slug }
  pages_in_section.each do |page|
    out << yield(page)
  end

  return out
end

具体来说,out << yield(page)部分困扰着我。它有效,但它似乎不是一个非常正确的DRY方式。因为,如果我想在我的视图中添加一个变量,我需要将它添加到块助手中并产生调用。

底线:我想从我的页面迭代到输出块中注入一个变量。这是最佳做法还是更好,更可读的替代方案?

理想情况下。我想做点什么:

<ul class="nav">
  <% each_page_in_section('over') do %>
    <li><%= page.menu_text %> <%= another_variable %></li>
  <% end %>
</ul>

帮助者在概念上看起来像这样:

def pages_for_section(section_slug, &block)
  pages_in_section = @pages.select { |p| p.section.slug == section_slug }
  pages_in_section.each do |page|
    another_variable = "I'm cool"
    # the `page` and the `another_variable` variable will automatically 
    # be available/copied to the block
    yield
  end
end

感谢。

1 个答案:

答案 0 :(得分:0)

如果你注射,那么你将在注射阻滞内产生屈服。

混乱来自于尝试同时屈服于块,块中的代码在视图中进行渲染,并返回值。我一次只做一个或另一个。如果您通过块内的代码进行渲染,请不要担心返回值。