Элегантный способ печати HTML-списков с помощью Ruby + ERB

У меня есть следующий код

<% if items.any? %>
    <ul class="level1">
        <% items.each do |item| %>
            <li class="item">
                <a href="#"><%= item.text %></a>
            </li>
        <% end %>
    </ul>   
<% end %>

Хотя это работает, мне было интересно, есть ли способ сделать его более элегантным. if а потом each не очень красиво...

Кто-нибудь знает более элегантный синтаксис?

4 ответа

Попробуй это, based on:

<% content_tag(:ul, class: 'level1') do %>
   <% content_tag_for(:li, items, class: "item") do |item|
      <%= link_to item.text, '#' %>
   <% end %>
<% end if items.any? %>   

5 строк, без лишних частичек, только помощники рельсов.

Как предполагает sawa, вы можете использовать Slim:

- if items.any?
  ul.level1
    - items.each do |item|
      li.item
        a href="#"
          = item.text

или хамл:

- if items.any?
  %ul.level1
    - items.each do |item|
      %li.item
        %a{href: "#"}= item.text

Оба производят красиво отформатированный HTML.

Это на самом деле выглядит уже достаточно элегантно для меня, но вы могли бы сделать это, чтобы сделать немного чище:

<% if items.any? %>
  <ul class="level1">
    = render items
  </ul>   
<% end %>

И тогда у вас есть li код в частичном называется _items.html.erb, вот так:

<li class="item">
  <a href="#"><%= item.text %></a>
</li>

Я хотел бы пойти на что-то вроде этого:

if items.any?
  content_tag(:ul, class: 'level1') do
    items.each do |item|
      concat content_tag(:li, class: 'item', item)
    end
  end
end
Другие вопросы по тегам