Los rieles comprueban si el rendimiento: el área está definida en content_for

97

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 hacerlo?

William Yeung
fuente
Vea mi respuesta para crear un método auxiliar para encapsular este comportamiento en Rails 3.
tristanm

Respuestas:

217

@content_for_whateveres obsoleto. Use en su content_for?lugar, así:

<% if content_for?(:whatever) %>
  <div><%= yield(:whatever) %></div>
<% end %>
gudleik
fuente
16
El ayudante content_for?solo existe en Rails 3. En Rails 2 puede usar la @content_for_...variable de instancia.
no sea que el
10

no es realmente necesario para crear un método auxiliar:

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

luego, por supuesto, en su opinión:

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

Utilizo esto todo el tiempo para ir condicionalmente entre un diseño de una columna y dos columnas

efalcao
fuente
2
<%if content_for?(:content)%>
  <%= yield(:content) %>
<%end%>
Gregwinn
fuente
2

Puede crear un ayudante:

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

Y usa esto en tu diseño:

<% if content_defined?(:an__area) %>
  <h1>An area is defined: <%= yield :an__area %></h1>
<% end %>
Mella
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
eirikir
Estoy de acuerdo @eirikir, no estoy seguro de lo que pensaba mi yo de 6 años más joven. Estoy ampliando y dejando mi respuesta para aquellos que todavía están en Rails 2 ... sin el preámbulo innecesario;)
Nick
1

Ok, voy a hacer una auto respuesta descaradamente, ya que nadie ha respondido y ya he encontrado la respuesta :) Defina esto como un método auxiliar en application_helper.rb o en cualquier lugar que le resulte 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
William Yeung
fuente
Je, bueno, me gusta tu auto-respuesta pero ... Un punto menor, instance_variable_defined?(content_var_name)es un poco más ordenado que en lugar de probar si es nulo. Segundo punto más importante, la variable de instancia content_for está obsoleta, por lo que su solución no está preparada para el futuro
Dave Nolan
1

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

<% if yield :sidebar %>
  <div id="sidebar">
    <%= yield :sidebar %>
  </div>
<% end %>
Enrico
fuente