Rails/ERB中的条件标记包装

Jos*_*ber 22 ruby ruby-on-rails erb

在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 %>
Run Code Online (Sandbox Code Playgroud)

==更新==

我使用了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
Run Code Online (Sandbox Code Playgroud)

==用法

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

Gal*_*Gal 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
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的视图中使用这样的:

<% @items.each do |item| %>
  <% conditional_div(:show_div => item.isolated?, :class => 'isolated') do %>
    <%= item.name.pluralize %>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)


Pre*_*ids 6

尝试:

<% @items.each do |item| %>
  <div class="<%= item.isolated? 'isolated' : '' %>">
    <%= item.name.pluralize %>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)