2012-04-15 8 views
8

Rendering ich in meinem Users_controller definiert haben:Richtig mehrere Layouts pro Controller in Rails

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

Hier ist, was mein Layout wie folgt aussieht: 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) 

Wenn ich eine Seite rendern, die intro als das Layout aufruft, wird es in meinemverschachteltDatei, die nicht gut ist.

Gibt es eine Möglichkeit, diese unerwünschte Verschachtelung von Layouts zu vermeiden?

Vielen Dank im Voraus!

Antwort

41

Das Problem war in meinem Controller. Ich wurde erklärt, mehrere Layout-Instanzen wie so:

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

Tu das nicht! Die zweite Deklaration hat Vorrang und Sie erhalten nicht den gewünschten Effekt.

Stattdessen, wenn Ihre Layouts einfach aktionsspezifische sind, erklären sie nur innerhalb der Aktion wie folgt aus:

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

Oder, wenn es ein bisschen komplizierter ist, können Sie ein Symbol, um die Verarbeitung zu verschieben verwenden können, um eine Methode zur Laufzeit wie folgt:

class UsersController < ApplicationController 
    layout :determine_layout 
    ... 

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

Vielen Dank! Habe mein Gesicht gerettet! –