Voglio eseguire un rendering condizionale a livello di layout in base al modello effettivo definito content_for(:an__area)
, qualsiasi idea su come ottenere questo risultato?Rails controlla se yield: area è definita in content_for
risposta
@content_for_whatever
è deprecato. Usa content_for?
invece, in questo modo:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
Helper 'content_for?' Esiste solo in Rails 3. In Rails 2 puoi usare la variabile di istanza '@content_for _...' . – lest
Eccellente! Ho scritto questo per troppo tempo. Non più. – morganjlopes
funziona anche su binari 4. great thx – daniel
Ok, sto andando spudoratamente a rispondere autonomamente perché nessuno ha risposto e ho già trovato la risposta :) Definisci questo come un metodo di supporto sia 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
Heh, mi piace la tua auto-risposta, ma ... Il punto minore, 'instance_variable_defined? (Content_var_name)' è un po 'più ordinario di invece di testare se è nulla. Secondo punto più grande, la variabile di istanza content_for è deprecata, quindi la tua soluzione non è a prova di futuro –
possibile creare un aiutante:
def content_defined?(var)
content_var_name="@content_for_#{var}"
!instance_variable_get(content_var_name).nil?
end
E utilizzare questo nel layout:
<% if content_defined?(:an__area) %>
<h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – eirikir
Sono d'accordo @eirikir, non sono sicuro di cosa stesse pensando il mio sé di 6 anni più giovane. Sto estendendo e lasciando la mia risposta per quelli ancora su Rails 2 .. senza il preambolo non necessario;) – Nick
non proprio necessario creare un metodo di supporto:
<% if @content_for_sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
poi ovviamente a tuo avviso:
<% content_for :sidebar do %>
...
<% end %>
Io uso questo tutto il tempo di andare in modo condizionale tra un'una colonna e due colonne di layout
Non sono sicuro delle implicazioni sulle prestazioni di chiamare due volte il rendimento, ma questo farà a prescindere dal interna implementazione di rendimento (@content_for_xyz è deprecato) e senza metodi di codice o di supporto in più:
<% if yield :sidebar %>
<div id="sidebar">
<%= yield :sidebar %>
</div>
<% end %>
<%if content_for?(:content)%>
<%= yield(:content) %>
<%end%>
Vedi la mia [risposta] (http://stackoverflow.com/questions/3347322/yield-if-content-render-something-otherwise-rails-3/7409626 # 7409626) per creare un metodo di supporto per incapsulare questo comportamento in Rails 3. – tristanm