2009-10-16 12 views
10

Tengo un controlador con la siguiente lógica de diseñoRuby on Rails diseños ... excepto y únicamente fallo

layout 'sessions', :except => :privacy 
    layout 'static', :only => :privacy 

La cuestión es que los carriles parece ignorar la primera línea de código y las "sesiones" de diseño es no aplicado para ninguna acción. Simplemente piensa renderizar el diseño estático para privacidad y ningún diseño para el resto.

¿Alguien sabe cómo solucionar esto?

Respuesta

10

Otra opción es definir un método para su llamada diseño, así:

layout :compute_layout 

y luego

def compute_layout 
    action_name == "privacy" ? "static" : "sessions" 
end 

Sin embargo, esto es realmente sólo es útil cuando se desea dete rmine el diseño en tiempo de ejecución en función de algún parámetro de tiempo de ejecución (como una variable que se está configurando). En tu ejemplo, eso no parece ser necesario.

+0

esto es lo que recurrí a ... +1 para el "nombre de acción" ... no sabía acerca de eso – Tony

+0

nombre_actitud también es fácil de lanzar en un bloque de caso/cuando/entonces cuando tiene que tratar con más de 2 comportamiento. – Jared

2

Puede especificar layout :static donde lo necesite.

23

La razón por la que esto no funciona es porque solo se puede tener una declaración de diseño global por controlador. Las condiciones :only y :except solo diferencian entre las acciones que deberían obtener el diseño especificado y las que se excluyen se representan sin un diseño. En otras palabras, una declaración de diseño siempre afecta a todas las acciones que usan representación predeterminada.

Para sustituir sólo tiene que especificar un diseño cuando se renderiza como uno de los siguientes ejemplos dentro de una acción:

render :layout => 'static' 
render :action => 'privacy', :layout => 'static' 
render :layout => false # Don't render a layout 
+3

Esta es una solución mucho mejor que la aceptada para el caso descrito. –