2011-04-27 34 views
20

¿Cuál sería la forma más fácil de leer y/o escribir concisa esto en ERB? Escribir mi propio método no es preferible, ya que me gustaría diseminar una solución más limpia para otros en mi compañía.envoltura etiqueta condicional en Rails/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 %> 

== == Actualización

que utilizan una versión más genérica de la respuesta de la etiqueta Gal que es agnóstico.

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 

Uso ==

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

Respuesta

17

Si realmente desea que el DIV sea condicional, se podría hacer algo como esto:

poner esto en 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 luego se puede utilizar como este en su punto de vista:

<% @items.each do |item| %> 
    <% conditional_div(:show_div => item.isolated?, :class => 'isolated') do %> 
    <%= item.name.pluralize %> 
    <% end %> 
<% end %> 
+0

Pensé que quería evitar esto. En última instancia, es la dirección que elegí. –

3

Probar:

<% @items.each do |item| %> 
    <div class="<%= item.isolated? 'isolated' : '' %>"> 
    <%= item.name.pluralize %> 
    </div> 
<% end %> 
+0

Gracias, pero desafortunadamente esto no funcionará porque aún incluirá un div que aún romperá el flujo. –

+1

Trabajó para mis propósitos (fuera del alcance de esta pregunta). ¡Gracias! –

1

voy a sugerir el uso de un ayudante que se hará cargo de su lógica.

Evitar condicionales, si, etc en vistas el mayor tiempo posible.

0

I como respuesta PreciousBodilyFluids', pero no lo hace estrictamente exactamente lo que hace el método existente. Si realmente no se puede tener un div envoltura, esto puede ser prefereable:

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

un método de ayuda a hacer todo esto, probablemente vería así:

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

A continuación, el código de la vista sería el siguiente :

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