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?
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?
Respuestas:
@content_for_whatever
es obsoleto. Use en su content_for?
lugar, así:
<% if content_for?(:whatever) %>
<div><%= yield(:whatever) %></div>
<% end %>
content_for?
solo existe en Rails 3. En Rails 2 puede usar la @content_for_...
variable de instancia.
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
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 %>
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
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
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 %>