Rails / ERB中的条件标记包装

在ERB中写这个最可读和/或最简洁的方法是什么? 编写我自己的方法并不可取,因为我想将更清晰的解决方案传播给我公司的其他人。

  

==更新==

我使用了Gal的答案的更通用版本,该答案是标签不可知的。

 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 

==用法

   "isolated") do %>    

如果你真的希望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 %> 

尝试:

 <% @items.each do |item| %> 
<%= item.name.pluralize %>
<% end %>

我建议使用一个能够处理你逻辑的助手。

尽可能在视图中避免条件,if等。

我喜欢PreciousBodilyFluids的答案,但它并没有严格按照现有方法的作用。 如果你真的不能拥有包装div,这可能是优先的:

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

执行所有这些操作的辅助方法可能如下所示:

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