2011-05-08 22 views
12

Quizás haya una razón técnica/de implementación para ello, pero me parece que el "diseño" es tan claramente parte de la capa de vista como puede ser, sin embargo, parece que Rails solo permite especificar el diseño en un nivel de controlador.¿Por qué Rails hace de la selección de diseño una preocupación del controlador en lugar de una preocupación de vista? ¿Puedo elegir un diseño desde una vista?

Mi controlador no debería preocuparse por los diseños ... las plantillas deberían. ¿Hay alguna forma de especificar qué diseño usar dentro del archivo .erb?

Algo así como:

<%= with_layout :news_feed do %> 

    <p> 
    My markup in here. 
    </p> 

<% end %> 

O cualquier otra aplicación que se pueda imaginar ... pero la documentación sólo parece referirse a la disposición desde la perspectiva del controlador.

Tal vez no sería demasiado difícil implementar un ayudante with_layout.

EDIT | He encontrado exactamente lo que estaba buscando:

<% render :layout => "some_layout" do %> 
    <p> 
    My markup here 
    </p> 
<% end %> 

Ahora siempre que su ActionController tiene:

class ApplicationController < ActionController::Base 
    layout nil 

Entonces cada plantilla puede seleccionar su propio diseño, el uso de este enfoque.

Si coloca un diseño en la aplicación/diseños, con un nombre que coincida con el controlador, ese diseño se utilizará, por lo que no tiene que especificar estrictamente si son todos iguales. De cualquier manera, el tio cómo escribe sus plantillas ahora tiene el control total de la misma, no es el tipo que está escribiendo los controladores :)

Respuesta

3

Hice algunas investigaciones y no encontré ninguna solución similar a la que está buscando.

Creo que eso podría tener que ver con el hecho de que la especificación de un diseño distinto del predeterminado se puede hacer nombrando un archivo your_controllers_name.html.erb bajo app/views/layouts. Esto puede eliminar cualquier lógica de su controlador si el mismo diseño siempre se usa para un controlador específico. Tal vez esto es lo que estás buscando? Si no tiene un nombre de controlador coincidente para un diseño, entonces se usará el predeterminado application.html.erb.

Si necesita renderizar un diseño diferente condicionalmente, entonces esa decisión debe hacerse en su controlador. De lo contrario, presionarías hacia abajo la lógica de la toma de decisiones. Su punto de vista no debería tener que tomar una decisión sobre el diseño que necesita porque el controlador está allí para tomar decisiones y configurar los datos necesarios que requiere una vista.

+0

Gracias, sí, obtuve esto de los documentos, pero parece un poco raro. Nuestro equipo está claramente dividido en diseñadores y desarrolladores, y los diseñadores nunca deberían tener que tocar nuestros controladores. Tal vez nos limitaremos a utilizar un diseño vacío con inclusiones para las partes superior e inferior incluidas por los tipos front-end. O tal vez investigue una solución que permita un bloque 'with_layout'. Tenemos cuatro o cinco diseños "estándar", y no están necesariamente vinculados con ningún controlador específico ... solo depende del contenido de la página. – d11wtq

+1

'<% render: layout =>" some_layout "do%> .... <% end %>;) – d11wtq

+0

@ d11wtq - Veo de dónde vienes, aunque tus diseñadores todavía no necesitarían tocar el código del controlador ¿no? Podrían simplemente crear los diseños en el directorio de diseños y luego los desarrolladores agregarían cualquier código condicional si fuera necesario. En general, sin embargo, probablemente pueda salirse con la suya con el esquema de convención de nomenclatura de controlador el 95% del tiempo. – McStretch

1

algunas declaraciones:

diseño es sobre la representación.
El diseño se puede llamar solo una vez.
Vistas: son el nivel superior (último) de representación.
Controlador: es una capa de renderizado de primer nivel.

Así que puedo decir que el único lugar donde podemos establecer el diseño es un controlador. Si pudiéramos configurar el diseño desde las vistas, obtendríamos problemas con el diseño anidado, ya que cada vista (parcial también) llamará a su propio diseño.

Es fácil y claro cómo el controlador establece el diseño. Y no está claro y complicado si estamos configurando la vista de nivel primario de sus hijos.

¿De qué estás hablando? Está cediendo (content_for) y parciales (render :partial). Son excelentes herramientas y funcionan perfectas.

+1

Bueno, tendría que estar en desacuerdo con que es una preocupación del controlador. Esa podría ser la solución más fácil, pero el diseño es básicamente parte de la plantilla; no tiene nada que ver con el controlador. Sé que el lugar donde lo configuramos está en el controlador ... pero esto es algo de Rails, no algo de MVC. – d11wtq

+0

Además, con respecto a los diseños anidados, sería muy posible tener sub-diseños, para cosas como dibujar cuadros alrededor del contenido, etc. básicamente es solo decir: "Estoy a punto de generar algún contenido, y quiero esto archivo para representar ese contenido ". Si ese archivo contiene etiquetas y otras cosas de nivel superior no está ni aquí ni allá;) – d11wtq

+1

@ d11wtq, 'para cosas como dibujar cajas alrededor de contenido, etc." eso es exactamente lo que hacen los parciales. No necesita sublayouts en absoluto. Diseño: es un archivo único sin sublayouts. Los sublayouts son __partials__. La preocupación del controlador es elegir un diseño como punto de inicio para la representación. En realidad, qué controlador hace - __ está dando__. Por lo tanto, es el trabajo del controlador elegir el diseño. – fl00r

Cuestiones relacionadas