content_for no mostrar cuando se establece en el diseño para ser recuperado en la vista de acción

Primero que nada, estoy usando Rails 3.1.1 y ruby 1.9.3-p0. Después de experimentar durante unas horas en mi proyecto existente y un nuevo proyecto de "verificación de cordura", puedo confirmar que esto no parece funcionar. Lo intenté tanto en HAML como en ERB, pero aquí está la versión de HAML. Primero el archivo de diseño:

/ application.html.haml
- content_for :stuff, "some content"
#content
  = yield  # lets say we are in the show action

Seguido por la vista de acción:

/ show.html.haml
= content_for :stuff

El resultado es que nada se muestra. Espero estar extremadamente equivocado, por supuesto, porque realmente necesito poder hacer esto y parece que este es uno de esos escenarios comunes. ¿No debería funcionar esto o no? Si no es así, ¿podría recibir una sugerencia sobre una buena alternativa? ¡Gracias!

preguntado el 08 de noviembre de 11 a las 13:11

No sé si su problema tiene que ver con la versión ruby, pero 1.9.3 no es una versión compatible y debe evitarla. -

@PauloAbreu Creo que se está animando activamente a la gente a ejecutar cosas en 1.9.3. Estoy seguro de que Rails es totalmente compatible con 1.9.x. Quizás el soporte para 1.9.1 podría desaparecer en un futuro próximo. Independientemente, el problema en este caso particular no está relacionado con la versión ruby. -

@AdityaSanghi El sitio web de Ruby on Rails es muy claro sobre 1.9.1: no es compatible (rubyonrails.org/download). Pero debido a la naturaleza de Rails, es posible que esta información esté desactualizada. -

La vista de la acción se renderiza antes que el diseño. ¿Puede explicar su requisito por favor? Estoy seguro de que hay una respuesta fácil:

3 Respuestas

No conozco a HALM, pero parece que está invirtiendo el orden correcto.

Usted define el content_for en su diseño (application.html.erb)

<%= content_for :something if a_test %>

Y lo que debería reemplazarse con en tu vista

<% content_for :something do %>
  Hello World
<% end %>

respondido 08 nov., 11:18

No está invertido porque quiero mostrar mi content_for en la vista de acciones, no en el diseño. Más bien, quiero configurar mi content_for en el diseño y mostrarlo en la vista de acciones. - axsuul

Así que revisé el código fuente y descubrí que esto en realidad no es posible porque las plantillas se representan antes que el archivo de diseño. Todavía tengo que encontrar una solución alternativa.

respondido 09 nov., 11:03

Realmente no entiendo tu requerimiento. ¿Por qué necesita definir el contenido de una vista en su diseño? - Paulo Abreu

Creo que te equivocaste. Aquí está el código corregido con alguna explicación:

/ application.html.haml
#content
  = yield(:stuff)  # lets say we are in the show action

/ show.html.haml
- content_for :stuff do
  = "Some content with #{some.computation}"

Lo que he cambiado:

  • En su application.html.haml, debe especificar la estructura y luego indicar el contenido. Esto es hecho por yield(:stuff).
  • En tu archivo show.html.haml, define cuál es el contenido de stuff es. Esto normalmente se hace con un bloque, pero podría hacerse como: - content_for :stuff, "My content".

Después de tu comentario, he entendido lo que realmente querías alcanzar. Solo para estar seguro, creo que quieres lo siguiente:

  • Definir el contenido de algo en el application.html.haml archivo.
  • Use ese contenido solo en algunos de los archivos de vista (en el ejemplo show.html.haml para un controlador).

Primero, no entiendo por qué harías algo así. Y segundo, sí, las vistas se renderizan primero. La única opción que tiene es incluir la definición y el uso en su application.html.haml archivo así:

/ application.html.haml
- content_for :stuff, "some content"
#content
  = yield(:stuff) if controller.action_name == 'show'

respondido 09 nov., 11:10

Esta es la respuesta correcta. Use yield (: stuff) para generar material y content_for: stuff {} para enviar material. - Aditya Sanghi

Gracias por la respuesta, sin embargo, esta no es la funcionalidad que quiero. Quiero poder configurar el content_for en el archivo de diseño de la aplicación, no dentro de la vista de acciones. ¿No hay forma de que pueda hacer eso? - axsuul

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.