2008-10-11 13 views
84

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

+0

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

risposta

193

@content_for_whatever è deprecato. Usa content_for? invece, in questo modo:

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

Helper 'content_for?' Esiste solo in Rails 3. In Rails 2 puoi usare la variabile di istanza '@content_for _...' . – lest

+0

Eccellente! Ho scritto questo per troppo tempo. Non più. – morganjlopes

+2

funziona anche su binari 4. great thx – daniel

1

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 
+0

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 –

2

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 %> 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – eirikir

+0

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

10

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

1

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 %> 
2
<%if content_for?(:content)%> 
    <%= yield(:content) %> 
<%end%> 
Problemi correlati