Rails, verim: alan content_for içinde tanımlı mı kontrol edin


97

Tanımlanan gerçek şablona göre düzen düzeyinde bir koşullu oluşturma yapmak istiyorum, bunun content_for(:an__area)nasıl yapılacağına dair bir fikriniz var mı?


Bu davranışı Rails 3'te
kapsayacak

Yanıtlar:


217

@content_for_whateverkullanımdan kaldırıldı. content_for?Bunun yerine şu şekilde kullanın :

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>

16
Yardımcı content_for?yalnızca Rails 3'te bulunur. Rails 2'de @content_for_...örnek değişkenini kullanabilirsiniz .
diye

10

yardımcı bir yöntem oluşturmak için gerçekten gerekli değildir:

<% if @content_for_sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>

o zaman elbette size göre:

<% content_for :sidebar do %>
  ...
<% end %>

Bunu her zaman bir sütun ve iki sütun düzeni arasında koşullu olarak gitmek için kullanıyorum


2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>

2

Yardımcı oluşturabilir:

def content_defined?(var)
  content_var_name="@content_for_#{var}"    
  !instance_variable_get(content_var_name).nil?
end

Ve bunu düzeninizde kullanın:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>

Bu soruya bir cevap vermiyor. Bir yazarı eleştirmek veya açıklama istemek için yazının altına bir yorum bırakın.
eirikir

@Eirikir'e katılıyorum, 6 yaşımdaki genç benliğimin ne düşündüğünden emin değilim. Cevabımı hala Rails 2'de olanlar için uzatıyorum ve gereksiz önsöz olmadan;)
Nick

1

Tamam, hiç kimse cevap vermediği ve cevabı zaten bulduğum için utanmadan kendi kendine cevap vereceğim :) Bunu application_helper.rb'de veya uygun bulduğunuz herhangi bir yerde yardımcı bir yöntem olarak tanımlayın.

  def content_defined?(symbol)
    content_var_name="@content_for_" + 
      if symbol.kind_of? Symbol 
        symbol.to_s
      elsif symbol.kind_of? String
        symbol
      else
        raise "Parameter symbol must be string or symbol"
      end

    !instance_variable_get(content_var_name).nil?

  end

Pekala, kendi kendine cevabını beğendim ama ... Önemsiz bir nokta, instance_variable_defined?(content_var_name)sıfır olup olmadığını test etmekten biraz daha temiz. İkinci önemli nokta, content_for örnek değişkeni kullanımdan kaldırıldı, bu nedenle çözümünüz geleceğe uygun değil
Dave Nolan

1

Getiriyi iki kez çağırmanın performans sonuçlarından emin değilim, ancak bu, verimin dahili uygulamasından (@content_for_xyz kullanımdan kaldırılmıştır) ve herhangi bir ekstra kod veya yardımcı yöntem olmadan yapılacaktır:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.