2011-09-06 11 views
9

Me he encontrado con una rareza que no puedo explicar con respecto a Rails 3 y la representación de parciales con diseños (desde el controlador). Espero que alguien pueda darnos una idea de lo que está sucediendo.Rails 3 vs 2.3.5 render oddities con: partial y: layout

En primer lugar, llamaremos a este controlador un controlador "heredado". Ha existido por mucho tiempo y está haciendo muchas cosas mal, pero no estoy buscando una refactorización en este momento, así que estoy tratando de encontrar formas de trabajar con lo que tenemos.

La acción new es algo como esto (en el BarsController)

def new 
    if something 
    render :partial => "foo", :layout => "bars" 
    elsif something_else 
    render :partial => "foo2", :layout => "bars" 
    elsif something_else_else 
    render :partial => "foo3", :layout => "bars" 
    else 
    render :partial => "foo4", :layout => "bars" 
end 

Ahora, en Rails 2.3.5, esto funcionó bien. Representaría el parcial apropiado dentro del diseño apropiado. Me doy cuenta de que la opción de diseño es redundante aquí, ya que de todos modos sería el diseño de barras. Cuando nos pasaron a Rails 3.0.x, empezamos a recibir los errores de la siguiente manera:

Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html] 

Es evidente que el archivo layouts/bars.html.erb es y siempre ha estado allí, así que no podía entenderlo. Pude renderizar con :layout => false, pero eso por supuesto no iba a funcionar. Con el tiempo me di cuenta de que si hago alguna de las siguientes, funciona:

1) Cambiar el nombre de mi diseño a _bars.html.erb en lugar de bars.html.erb y:

render :partial => 'foo2', :layout => 'bars'

2) Mantener mi diseño como bars.html.erb (lo quiero) y:

render '_foo2' # :partial option is redundant here anyway


Parece que al utilizar la opción: partial en lugar de la cadena como primer parámetro, los carriles aplican la convención _name.html.erb tanto al partial como al layout. Si pongo el guión bajo por mi cuenta, se vuelve al comportamiento que esperaba, que no es anterior a un _ delante del nombre del diseño.

¿Alguien sabe por qué este es el caso?


EDITAR bien, no sé cómo me perdí esto ... pero aquí hay algo en los documentos que hacen mención de esto. Parece que ha existido desde 2.3.8, tal vez se hizo de manera diferente en 2.3.5 (¿en qué estábamos corriendo?)

3.4.3 Presentaciones parciales

Un parcial puede utilizar su propio archivo de diseño, así como un punto de vista puede utilizar un diseño . Por ejemplo, es posible llamar a un parcial de esta manera:

<% = render "link_area",: layout => "Graybar" %> Esto sería buscar un nombre parcial _link_area.html.erb y hacerlo mediante el diseño _graybar.html.erb.Tenga en cuenta que los diseños para parciales siguen el mismo que marcan el subrayado principal como parciales regulares, y se colocan en la misma carpeta con el parcial al que pertenecen (no en la carpeta de diseños maestros ).


+0

Esto requeriría más modificaciones de código si pasa parámetros a los parciales, a través de: object o: locales ya que estos no funcionan con plantillas. Desearía que no hubieran cambiado el comportamiento ... – farhadf

Respuesta

15

Aquí es mi propia respuesta a la pregunta sobre la base de lo que he editado anteriormente:

Desde Rails 2.3.8, parecería como si el comportamiento por defecto cuando se representa un parcial con render :partial => 'foo', :layout => 'bars' es esperar un archivo de "distribución parcial", así como un archivo de vista parcial. En este caso se esperaría

app/views/_foo.html.erb, así como app/views/layouts/_bars.html.erb

Para cualquier persona que tiene este problema desde la actualización 2.3.5 Carriles, aquí está la solución que encontró que tienen la menor cantidad de impacto:

render '_foo', :layout => 'bars'

Esta solución no supone que está generando un parcial y, por lo tanto, no espera un diseño parcial. La otra opción sería la de duplicar su disposición a

app/views/layouts/_bars.html.erb

y el uso de

render :partial => 'foo', :layouts => 'bars'

pero que se traduce en una duplicación de código.

CARRILES 2.3.8+ DOC RESPECTO A ESTO:

3.4.3 Presentaciones parciales

Un parcial puede utilizar su propio archivo de diseño, así como un punto de vista puede utilizar un diseño . Por ejemplo, es posible llamar a un parcial de esta manera:

<% = render "link_area",: layout => "Graybar" %> Esto sería buscar un nombre parcial _link_area.html.erb y hacerlo mediante el diseño _graybar.html.erb. Tenga en cuenta que los diseños para parciales siguen el mismo que marcan el subrayado principal como parciales regulares, y se colocan en la misma carpeta con el parcial al que pertenecen (no en la carpeta de diseños maestros ).

+0

muy útil, ¡gracias por compartir! – Rubytastic

Cuestiones relacionadas