В Rails, как я могу сделать вспомогательный цикл? - PullRequest
2 голосов
/ 01 августа 2011

Допустим, я хочу создать помощник по списку HTML, который позволил бы мне циклически проходить по коллекции и выводить теги <ul> или <ol> только при наличии каких-либо элементов списка (что я на самом деле имею в виду, так это немного неприятнее, но это будет работать для примера).

Что-то вроде:

<% html_list(:ul, MyModel.all) do |my_model| %>
  <span><%= my_model.id %></span>
<% end %>

(Как вы можете сказать, я потерялся.)

Я не могу обернуть голову вокруг того, что будет происходить в моем html_list методе. Не могли бы вы указать мне правильное направление?

1 Ответ

4 голосов
/ 01 августа 2011

Возможно, вы захотите что-то вроде этого:

def html_list(tag, enum)
    html = '<' + tag.to_s + '><li>'
    html << enum.map { |e| yield e }.join('</li><li>')
    html << '</li></' + tag.to_s + '>'
    html.html_safe
end

или, возможно, так:

def html_list(tag, enum)
    html = [
        '<' + tag.to_s + '>',
        '<li>',
        enum.map { |e| yield e }.join('</li><li>'),
        '</li>',
        '</' + tag.to_s + '>'
    ]
    html.join.html_safe
end

Существуют различные способы построения окончательной строки, суть которой заключается в том, что вы создаете метод, который принимает блок, выполняет итерацию по перечисляемому и применяет блок к каждому элементу по пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...