【问题标题】:Converting Rails 3 to Rails 2: helpers with blocks将 Rails 3 转换为 Rails 2:带块的助手
【发布时间】:2011-04-07 13:09:23
【问题描述】:

在 Rails 3 中,我使用以下帮助程序来获得偶数颜色的表格:

def bicolor_table(collection, classes = [], &block)
  string = ""
  even = 0
  for item in collection
    string << content_tag(:tr, :class => (((even % 2 == 0) ? "even " : "odd ") + classes.join(" "))) do
        yield(item)
    end
    even = 1 - even
  end
  return string
end

我在我的视图中这样使用它:

<%= bicolor_table(services) do |service| %>
    <td><%= image_tag service.area.small_image %></td>
    <td><%= link_to service.title, service %></td>
<% end %>

现在,我必须将应用程序迁移到 Rails 2。问题是 Rails 2 不使用 Erubis,所以当它找到 标记时,它只调用whatever.to_s。所以,就我而言,这导致尝试执行

(bicolor_table(services) do |service|).to_s

具有明显的(坏的)后果。问题是:我在原则上是错的(比如“助手不应该以这种方式工作,而是使用......”)还是我应该寻找解决方法?

谢谢。

【问题讨论】:

    标签: ruby-on-rails helper view-helpers


    【解决方案1】:

    这可能无法回答您的问题,但有一种更简单的方法可以使用 cycle 命令实现偶数/奇数颜色表

     @items = [1,2,3,4]
      <table>
      <% @items.each do |item| %>
        <tr class="<%= cycle("even", "odd") -%>">
          <td>item</td>
        </tr>
      <% end %>
      </table>
    

    希望这篇文章能向您介绍一个很酷的 Rails 实用程序

    【讨论】:

    • 这是一种很好且有用的方法来实现我在这种情况下需要的东西,但我仍然想知道将块传递给助手是否是一种可接受的行为。感谢您的回答! :-)
    【解决方案2】:

    这是完全可行的,实际上使某些类型的助手变得更加简单。您需要使用&lt;% %&gt;concat 来实现此目的。

    def my_block_helper(param, &block)
      output = %(<div class="wrapper-markup">#{ capture(&block) }</div>)
      concat output
    end
    

    像这样在你的视图中使用它:

    <% my_block_helper do %>
      <span>Some Content</span>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多