【问题标题】:How to iterate over a yielded block in a Rails helper with arguments如何在带有参数的 Rails 助手中迭代产生的块
【发布时间】:2012-05-30 11:10:29
【问题描述】:

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

<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 &lt;&lt; yield(page) 部分困扰着我。它有效,但它似乎不是一个非常正确的 DRY 方式。因为,如果我想在我的视图中添加一个变量,我也需要将它添加到块帮助程序和 yield 调用中。

底线:我想将一个变量从我的页面迭代中注入到产生的块中。这是最佳做法还是有更好、更易读的替代方法?

理想情况下。我想做类似的事情:

<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

谢谢。

【问题讨论】:

  • 更新了我原来的帖子,希望能让我的问题更清楚一点。

标签: ruby-on-rails block yield helpers


【解决方案1】:

如果你注入,那么你将在一个注入块中产生一个收益。

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

【讨论】:

  • 好的,谢谢!所以这是一个很好的建议。但是,我认为我的问题还不够清楚,所以我添加了另一个示例来尝试传达我的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多