簡體   English   中英

Rails / ERB 中的條件標簽包裝

[英]Conditional tag wrapping in 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 %>

== 更新 ==

我使用了標簽不可知論的 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

== 用法

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

如果你真的希望 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| %>
  <div class="<%= item.isolated? 'isolated' : '' %>">
    <%= item.name.pluralize %>
  </div>
<% end %>

我會建議使用一個助手來處理你的邏輯。

盡可能避免在視圖中使用條件、if 等。

我喜歡 PreciousBodilyFluids 的回答,但它並沒有嚴格按照您現有的方法做。 如果你真的不能有一個包裝 div,這可能是更可取的:

<% @items.each do |item| %>
  <% if item.isolated? %>
    <div class="isolated">
      <%= item.name.pluralize %>
    </div>
  <% 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 %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM