Saya ingin melakukan rendering bersyarat pada tingkat tata letak berdasarkan template sebenarnya yang telah ditentukan content_for(:an__area)
, ada ide bagaimana cara melakukannya?
Saya ingin melakukan rendering bersyarat pada tingkat tata letak berdasarkan template sebenarnya yang telah ditentukan content_for(:an__area)
, ada ide bagaimana cara melakukannya?
Jawaban:
@content_for_whatever
sudah ditinggalkan. Gunakan content_for?
sebagai gantinya, seperti ini:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
content_for?
hanya ada di Rails 3. Di Rails 2 Anda bisa menggunakan @content_for_...
variabel instance.
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
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 %>
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
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
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 %>