Balise conditionnelle d'emballage dans les Rails / ERB
quelle serait la manière la plus lisible et/ou concise d'écrire ceci dans ERB? Écrire ma propre méthode n'est pas préférable, car je voudrais répandre une solution plus propre pour cela à d'autres dans mon entreprise.
<% @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 %>
= = mise à jour = =
j'ai utilisé une version plus générique de la réponse de Gal qui est tag agnostic.
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
== Utilisation
<% @items.each do |item| %>
<% conditional_wrapper(item.isolated?, :class => "isolated") do %>
<%= item.name.pluralize %>
<% end %>
<% end %>
4 réponses
si vous voulez vraiment que la DIV soit conditionnelle, vous pouvez faire quelque chose comme ceci:
mettez ceci dans 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
que vous pouvez alors utiliser comme ceci dans votre vue:
<% @items.each do |item| %>
<% conditional_div(:show_div => item.isolated?, :class => 'isolated') do %>
<%= item.name.pluralize %>
<% end %>
<% end %>
, Essayez:
<% @items.each do |item| %>
<div class="<%= item.isolated? 'isolated' : '' %>">
<%= item.name.pluralize %>
</div>
<% end %>
Je suggérerai d'utiliser un assistant qui prendra soin de votre logique.
éviter les conditionnels, Si, etc dans les vues aussi longtemps que possible.
j'aime la réponse de PreciousBodilyFluids, mais il ne fait pas strictement ce que votre méthode existante fait. Si vous ne pouvez vraiment pas avoir de div d'enrubannage, cela peut être préfériable:
<% @items.each do |item| %>
<% if item.isolated? %>
<div class="isolated">
<%= item.name.pluralize %>
</div>
<% else %>
<%= item.name.pluralize %>
<% end %>
<% end %>
Une méthode d'aide pour faire tout cela serait probablement ressembler à ceci:
def pluralized_name_for(item)
if item.isolated?
content_tag(:div, item.name.pluralize, :class => 'isolated')
else
item.name.pluralize
end
end
alors votre code de vue ressemblerait à ceci:
<% @items.each do |item| %>
<%= pluralized_name_for(item) %>
<% end %>