2011-04-27 77 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 %>