Конвертация Rails 3 в Rails 2: помощники с блоками - PullRequest
4 голосов
/ 03 сентября 2010

В 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, поэтому, когда он находит тег <% = what%>, он просто вызывает любое. Так что, в моем случае, это приводит к попытке выполнить

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

С очевидными (плохими) последствиями. Вопрос в следующем: я не прав в принципе (например, «помощники не должны работать таким образом, используйте вместо этого…») или мне нужно искать обходной путь?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 сентября 2010

Это может не ответить на ваш вопрос, но есть гораздо более простой способ получить четную / нечетную таблицу цветов, используя команду cycle

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

Надеюсь, это познакомит вас с классной Rails-утилитой

3 голосов
/ 03 февраля 2011

Это вполне выполнимо, и фактически делает некоторые типы помощников намного проще.Вам нужно использовать <% %> и 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 %>
...