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 %>
21
demandé sur Joseph Jaber 2011-04-28 00:08:56

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 %>
17
répondu Gal 2011-04-27 20:28:25

, Essayez:

<% @items.each do |item| %>
  <div class="<%= item.isolated? 'isolated' : '' %>">
    <%= item.name.pluralize %>
  </div>
<% end %>
4
répondu PreciousBodilyFluids 2011-04-27 20:12:48

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.

1
répondu Esse 2011-04-27 20:18:00

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 %>
0
répondu Unixmonkey 2011-04-27 20:28:52