Условная упаковка тегов в Rails/ERB
Каким будет наиболее читаемый и/или сжатый способ написать это в 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 %>
== Обновление ==
Я использовал более общую версию ответа Gal, который является агностиком тега.
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 %>
Ответы
Ответ 1
Если вы действительно хотите, чтобы 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 %>
Ответ 2
Try:
<% @items.each do |item| %>
<div class="<%= item.isolated? 'isolated' : '' %>">
<%= item.name.pluralize %>
</div>
<% end %>
Ответ 3
Я предлагаю использовать помощника, который позаботится о вашей логике.
Избегайте условностей, если и т.д. в представлениях как можно дольше.
Ответ 4
Мне нравится ответ 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 %>