2011-04-27 87 views
20

在ERB中寫這個的最可讀和/或簡潔的方式是什麼?編寫我自己的方法是不可取的,因爲我想爲我的公司中的其他人傳播更清潔的解決方案。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 %> 

== ==更新

我用半乳糖的回答更寬泛的版本是標籤無關。

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 %> 

回答

17

如果你真的想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 %> 
+0

以爲我想避免這一點。這最終是我選擇的方向。 – 2011-04-27 21:25:57

3

嘗試:

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

謝謝,但不幸的是,這將無法正常工作,因爲它仍然會包含一個仍然會打破流動的div。 – 2011-04-27 20:27:00

+1

工作爲我的目的(超出了這個問題的範圍)。謝謝! – 2013-10-30 17:39:32

1

我會建議使用輔助,將你的邏輯的照顧。

避免條件,如果,等在視圖中儘可能長。

0

我喜歡PreciousBodilyFluids的答案,但它並不完全嚴格按照您現有的方法進行。如果你真的不能有包裝的div,這可能是prefereable:

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

的helper方法來做到這一切很可能是這樣的:

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 %>