2009-10-16 14 views
10

Ho un controller con la seguente logica di layoutRuby on Rails layout ... fatta eccezione bug

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

Il problema è che Rails sembra ignorare la prima riga di codice e la disposizione "sessioni" è non applicato per nessuna azione. Pensa semplicemente a rendere il layout statico per la privacy e nessun layout per il resto.

Qualcuno sa come risolvere questo problema?

risposta

10

Un'altra opzione è quella di definire un metodo per la vostra chiamata il layout, in questo modo:

layout :compute_layout 

e poi

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

ma questo è davvero utile solo quando si desidera Dete rmine il layout in fase di esecuzione in base a qualche parametro runtime (come una variabile impostata). Nel tuo esempio, ciò non sembra necessario.

+0

questo è quello che ho fatto ... +1 per il "nome_azione" ... non sapevo che – Tony

+0

nome_azione è anche facile da gettare in un caso/quando/poi bloccare quando devi occuparti di più di 2 Azioni. – Jared

2

Puoi semplicemente specificare layout :static dove ti serve.

23

Il motivo per cui questo non funziona è perché è possibile avere una dichiarazione di layout globale per controller. Le condizioni :only e :except distinguono semplicemente tra le azioni che dovrebbero ottenere il layout specificato e quelle che sono escluse vengono renderizzate senza un layout. In altre parole, una dichiarazione di layout influenza sempre tutte le azioni che utilizzano il rendering predefinito.

Per ignorare è sufficiente specificare un layout quando si esegue il rendering come uno dei seguenti esempi all'interno di un'azione:

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

Questa è una soluzione molto migliore rispetto a quella accettata per il caso descritto. –