2008-10-11 13 views
84

Quiero hacer una representación condicional en el nivel de diseño basado en la plantilla real que se ha definido content_for(:an__area), ¿alguna idea de cómo hacer esto?Rieles comprobar si el rendimiento: el área se define en content_for

+0

Ver mi [respuesta] (http://stackoverflow.com/questions/3347322/yield-if-content-render-something-otherwise-rails-3/7409626 # 7409626) para crear un método auxiliar para encapsular este comportamiento en Rails 3. – tristanm

Respuesta

193

@content_for_whatever está en desuso. Uso content_for? lugar, como este:

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

Helper 'content_for?' Existe solo en Rails 3. En Rails 2 podría usar '@content_for _...' instance variable . – lest

+0

¡Excelente! He escrito alternativas para esto por mucho tiempo. Ya no. – morganjlopes

+2

también funciona en rieles 4. great thx – daniel

1

Ok, voy a hacer una autocomplicación descarada ya que nadie ha respondido y ya he encontrado la respuesta :) Defina esto como un método de ayuda en application_helper.rb o en cualquier lugar que considere 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, bueno, me gusta su respuesta automática, pero ... Punto menor, 'variable_variable_de_instancia? (Nombre_del_varizador_contenedor)' es un poco más ordenado que en lugar de probar si es nulo. Segundo punto más grande, la variable content_for instance está en desuso por lo que su solución no es a prueba de futuro –

2

se puede crear un ayudante:

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

y utilizar esto en su diseño:

<% if content_defined?(:an__area) %> 
    <h1>An area is defined: <%= yield :an__area %></h1> 
<% end %> 
+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. – eirikir

+0

Estoy de acuerdo @eirikir, no estoy seguro de lo que estaba pensando mi hijo menor de 6 años. Estoy ampliando y dejando mi respuesta para aquellos que todavía están en Rails 2 ... sin el preámbulo innecesario;) – Nick

10

no es realmente necesario para crear un método de ayuda:

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

entonces por supuesto en su punto de vista:

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

Yo uso todo el tiempo para ir de forma condicional entre un diseño de una columna y dos columnas

1

No estoy seguro de las implicaciones de rendimiento de rendimiento llamar dos veces, pero esto va a hacer independientemente de la interna implementación de rendimiento (@content_for_xyz está en desuso) y sin ningún tipo de código o métodos auxiliares adicionales:

<% if yield :sidebar %> 
    <div id="sidebar"> 
    <%= yield :sidebar %> 
    </div> 
<% end %> 
2
<%if content_for?(:content)%> 
    <%= yield(:content) %> 
<%end%> 
Cuestiones relacionadas