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