2012-04-15 14 views
8

ho definito nel mio Users_controller:correttamente il rendering layout multipli per controller in Rails

layout "intro", only: [:new, :create]

Ecco cosa mio layout appare come: Intro.html.haml

!!! 5 
%html{lang:"en"} 
%head 
    %title Intro 
    = stylesheet_link_tag "application", :media => "all" 
    = javascript_include_tag "application" 
    = csrf_meta_tags 
%body{style:"margin: 0"} 
    %header 
    = yield 
    %footer= debug(params) 

Quando eseguo il rendering di una pagina che chiama il file intro come layout, viene annidata all'interno del mioFileche non è buono.

C'è un modo per evitare questo annidamento indesiderato di layout?

Grazie in anticipo!

risposta

41

Il problema era nel mio controller. Stavo dichiarando più istanze di layout in questo modo:

class UsersController < ApplicationController 
    layout "intro", only: [:new, :create] 
    layout "full_page", only: [:show] 
    ... 
end 

non lo fate! La seconda dichiarazione avrà la precedenza e non si otterrà l'effetto desiderato.

Invece, se i layout sono semplicemente specifiche per azione, basta dichiararlo all'interno dell'azione in questo modo:

def show 
... 
render layout: "full_page" 
end 

Oppure, se è un po 'più complesso, è possibile utilizzare un simbolo di rinviare l'elaborazione di un metodo in fase di esecuzione come questo:

class UsersController < ApplicationController 
    layout :determine_layout 
    ... 

    private 
    def determine_layout 
     @current_user.admin? ? "admin" : "normal" 
    end 
end 
+0

Grazie! Salvato la mia faccia! –

Problemi correlati