2011-04-27 30 views
20

Cách nào có thể đọc và/hoặc súc tích nhất để viết điều này trong ERB? Viết phương pháp của riêng tôi là không thích hợp hơn, vì tôi muốn truyền tải một giải pháp sạch hơn cho người khác trong công ty của tôi.Bao gồm thẻ có điều kiện trong 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 %> 

== Cập nhật ==

tôi đã sử dụng một phiên bản chung chung hơn của câu trả lời Gal của đó là thẻ thuyết bất khả tri.

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 

Cách sử dụng ==

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

Trả lời

17

Nếu bạn thực sự muốn DIV phải có điều kiện, bạn có thể làm một cái gì đó như thế này:

đặt này trong 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 

mà sau đó bạn có thể sử dụng như thế này theo quan điểm của bạn:

<% @items.each do |item| %> 
    <% conditional_div(:show_div => item.isolated?, :class => 'isolated') do %> 
    <%= item.name.pluralize %> 
    <% end %> 
<% end %> 
+0

Nghĩ rằng tôi muốn tránh điều này. Nó cuối cùng là hướng tôi đã chọn. –

3

Hãy thử:

<% @items.each do |item| %> 
    <div class="<%= item.isolated? 'isolated' : '' %>"> 
    <%= item.name.pluralize %> 
    </div> 
<% end %> 
+0

Cảm ơn nhưng tiếc là điều này sẽ không hoạt động vì nó vẫn sẽ bao gồm div sẽ vẫn phá vỡ luồng. –

+1

Được làm việc cho mục đích của tôi (ngoài phạm vi của câu hỏi này). Cảm ơn! –

1

Tôi sẽ đề nghị sử dụng một helper mà sẽ chăm sóc của logic của bạn.

Tránh điều kiện, nếu, v.v. trong các chế độ xem càng lâu càng tốt.

0

Tôi thích câu trả lời của PreciousBodilyFluids, nhưng nó không thực hiện chính xác phương pháp hiện có của bạn. Nếu bạn thực sự không thể có một gói div, đây có thể prefereable:

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

Một phương pháp helper để làm tất cả những điều này có lẽ sẽ giống như thế này:

def pluralized_name_for(item) 
    if item.isolated? 
    content_tag(:div, item.name.pluralize, :class => 'isolated') 
    else 
    item.name.pluralize 
    end 
end 

Sau đó, mã tầm nhìn của bạn sẽ trông như thế này :

<% @items.each do |item| %> 
    <%= pluralized_name_for(item) %> 
<% end %> 
Các vấn đề liên quan