2011-04-27 10 views
20

Jaki byłby najbardziej czytelny i/lub zwięzły sposób na zapisanie tego w ERB? Pisanie własnej metody nie jest preferowane, ponieważ chciałbym rozpowszechniać dla niej bardziej przejrzyste rozwiązanie w mojej firmie.Warunkowe pakowanie tagów w Railsach/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 %> 

== Aktualizacja ==

użyłem bardziej rodzajowe wersję odpowiedzi Gal, która jest tag agnostykiem.

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 

== Wykorzystanie

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

Odpowiedz

17

Jeśli naprawdę chcesz DIV być warunkowa, można zrobić coś takiego:

umieścić to w 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 

które następnie można użyć tak w widoku:

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

Myślałem, że chcę tego uniknąć. To ostatecznie kierunek, który wybrałem. –

3

Spróbuj:

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

Dzięki, ale niestety to nie zadziała, ponieważ nadal będzie zawierać element div, który będzie nadal łamał przepływ. –

+1

Pracowałem dla moich celów (poza zakresem tego pytania). Dzięki! –

1

będę sugerować przy użyciu pomocnika, który będzie dbać o swoje logiki.

Unikaj warunków, jeśli, itp. W widokach tak długo, jak to możliwe.

0

Ja lubię odpowiedź PreciousBodilyFluids, ale nie robi dokładnie to, co robi dotychczasowa metoda. Jeśli naprawdę nie może mieć div owijania, może to być prefereable:

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

Sposób pomocnik robić wszystko to prawdopodobnie wyglądać następująco:

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

Następnie kod widok będzie wyglądać następująco :

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