Voglio eseguire un rendering condizionale a livello di layout in base al modello effettivo definito content_for(:an__area)
, qualche idea su come ottenerlo?
Voglio eseguire un rendering condizionale a livello di layout in base al modello effettivo definito content_for(:an__area)
, qualche idea su come ottenerlo?
Risposte:
@content_for_whatever
è deprecato. Usa content_for?
invece, in questo modo:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
content_for?
esiste solo in Rails 3. In Rails 2 potresti usare la @content_for_...
variabile di istanza.
non proprio necessario per creare un metodo di supporto:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
poi ovviamente secondo te:
<% content_for :sidebar do %>
...
<% end %>
Lo uso sempre per passare in modo condizionale tra un layout a una e due colonne
Può creare un aiutante:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
E usa questo nel tuo layout:
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Ok, farò spudoratamente un'auto risposta poiché nessuno ha risposto e ho già trovato la risposta :) Definiscilo come metodo di supporto in application_helper.rb o ovunque tu abbia trovato conveniente.
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)
è un po 'più ordinato invece di provare se è zero. Secondo punto più importante, la variabile content_for instance è deprecata, quindi la tua soluzione non è a prova di futuro
Non sono sicuro delle implicazioni sulle prestazioni della chiamata di yield due volte, ma ciò andrà indipendentemente dall'implementazione interna di yield (@content_for_xyz è deprecato) e senza alcun codice aggiuntivo o metodi di supporto:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>