Условное перенос тега в Rails / ERB - PullRequest
21 голосов
/ 28 апреля 2011

Каков был бы самый читаемый и / или краткий способ написать это в ERB?Написание моего собственного метода не является предпочтительным, так как я хотел бы распространить более чистое решение для этого другим в моей компании.

<% @items.each do |item| %>
  <% if item.isolated? %>
    <div class="isolated">
  <% end %>

    <%= item.name.pluralize %> <%# you can't win with indentation %>

  <% if item.isolated? %>
    </div>
  <% end %>
<% end %>

== Обновление ==

Я использовал более общую версию ответа Гала, которая не имеет тегов.

def conditional_wrapper(condition=true, options={}, &block)
  options[:tag] ||= :div  
  if condition == true
    concat content_tag(options[:tag], capture(&block), options.delete_if{|k,v| k == :tag})
  else
    concat capture(&block)
  end
end

== Использование

<% @items.each do |item| %>
  <% conditional_wrapper(item.isolated?, :class => "isolated") do %>
    <%= item.name.pluralize %>
  <% end %>
<% end %>

Ответы [ 4 ]

17 голосов
/ 28 апреля 2011

Если вы действительно хотите, чтобы DIV был условным, вы можете сделать что-то вроде этого:

поместите это в application_helper.rb

  def conditional_div(options={}, &block)
    if options.delete(:show_div)
      concat content_tag(:div, capture(&block), options)
    else
      concat capture(&block)
    end
  end

, который вы можете использовать следующим образом:

<% @items.each do |item| %>
  <% conditional_div(:show_div => item.isolated?, :class => 'isolated') do %>
    <%= item.name.pluralize %>
  <% end %>
<% end %>
4 голосов
/ 28 апреля 2011

Попробуйте:

<% @items.each do |item| %>
  <div class="<%= item.isolated? 'isolated' : '' %>">
    <%= item.name.pluralize %>
  </div>
<% end %>
1 голос
/ 28 апреля 2011

Я предлагаю использовать помощника, который позаботится о вашей логике.

Избегайте условных выражений, если и т. Д. В представлениях как можно дольше.

0 голосов
/ 28 апреля 2011

Мне нравится ответ PreciousBodilyFluids, но он не совсем точно делает то, что делает ваш существующий метод.Если вы действительно не можете иметь div для переноса, это может быть предпочтительнее:

<% @items.each do |item| %>
  <% if item.isolated? %>
    <div class="isolated">
      <%= item.name.pluralize %>
    </div>
  <% else %>
    <%= item.name.pluralize %>
  <% end %>
<% end %>

Вспомогательный метод для всего этого, вероятно, будет выглядеть следующим образом:

def pluralized_name_for(item)
  if item.isolated?
    content_tag(:div, item.name.pluralize, :class => 'isolated')
  else
    item.name.pluralize
  end
end

Тогда ваш код представлениябудет выглядеть так:

<% @items.each do |item| %>
  <%= pluralized_name_for(item) %>
<% end %>
...