Rails memeriksa apakah hasil: area didefinisikan dalam content_for

97

Saya ingin melakukan rendering bersyarat pada tingkat tata letak berdasarkan template sebenarnya yang telah ditentukan content_for(:an__area), ada ide bagaimana cara melakukannya?

William Yeung
sumber
Lihat jawaban saya untuk membuat metode pembantu untuk merangkum perilaku ini di Rails 3.
tristanm

Jawaban:

217

@content_for_whateversudah ditinggalkan. Gunakan content_for?sebagai gantinya, seperti ini:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
gudleik
sumber
16
Helper content_for?hanya ada di Rails 3. Di Rails 2 Anda bisa menggunakan @content_for_...variabel instance.
jangan sampai
10

tidak terlalu diperlukan untuk membuat metode pembantu:

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

maka tentu saja menurut pandangan Anda:

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

Saya menggunakan ini sepanjang waktu untuk secara kondisional pergi antara satu kolom dan dua tata letak kolom

efalcao.dll
sumber
2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
gregwinn
sumber
2

Dapat membuat pembantu:

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

Dan gunakan ini dalam tata letak Anda:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Nick
sumber
Ini tidak memberikan jawaban atas pertanyaan tersebut. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah postingannya.
eirikir
Saya setuju @eirikir, tidak yakin apa yang dipikirkan oleh diri saya yang berusia 6 tahun lebih muda. Saya memperluas & meninggalkan jawaban saya untuk mereka yang masih di Rails 2 .. tanpa pembukaan yang tidak perlu;)
Nick
1

Ok saya akan tanpa malu-malu melakukan balasan sendiri karena tidak ada yang menjawab dan saya sudah menemukan jawabannya :) Definisikan ini sebagai metode penolong baik di application_helper.rb atau di mana pun Anda merasa nyaman.

  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
William Yeung
sumber
Heh, saya suka balasan Anda sendiri tetapi ... Poin kecil, instance_variable_defined?(content_var_name)sedikit lebih rapi daripada menguji apakah itu nihil. Poin kedua yang lebih besar, variabel instance content_for tidak digunakan lagi sehingga solusi Anda bukan bukti masa depan
Dave Nolan
1

Saya tidak yakin dengan implikasi kinerja dari memanggil yield dua kali, tetapi ini akan dilakukan terlepas dari implementasi internal yield (@content_for_xyz tidak digunakan lagi) dan tanpa kode tambahan atau metode pembantu:

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Enrico
sumber