2010-06-11 3 views
145

Ich verwende ein anderes Layout für einige Aktionen (meistens für die neue Aktion in den meisten Controllern).Schienenlayouts pro Aktion?

Ich frage mich, wie der beste Weg, um das Layout zu spezifizieren wäre? (Ich bin mit drei oder mehr verschiedenen Layouts in demselben Controller)

Ich mag es nicht

machen mit: layout => 'name'

ich gern tun

Layout 'name',: nur => [: neu]

Aber Ich kann das nicht verwenden, um 2 oder mehr verschiedene Layouts anzugeben.

Zum Beispiel:

Wenn ich rufe Layout 2 mal in dem gleichen Controller, mit verschiedenen Layout-Namen und andere nur die Optionen, die erste ignoriert werden - diese Aktionen I genannten Bedingungen nicht im Layout angezeigt werden soll.

Hinweis: Ich bin mit Rails 2.

+1

Die Rails Guides Dokumentation: http://guides.rubyonrails.org/layouts_and_rendering.html#finding-layouts – Kevin

+1

Guter Punkt. Die Dokumentation für Rails 2: http://guides.rubyonrails.org/v2.3.11/layouts_and_rendering.html#finding-layouts – Kevin

+2

(Außerdem habe ich den Leitfaden veröffentlicht, um zukünftigen Lesern zu helfen. Ich habe keinen Zweifel, dass du dein Problem gelöst hast vor langer Zeit ;-) – Kevin

Antwort

263

Sie eine Methode verwenden, können das Layout festlegen.

class MyController < ApplicationController 
    layout :resolve_layout 

    # ... 

    private 

    def resolve_layout 
    case action_name 
    when "new", "create" 
     "some_layout" 
    when "index" 
     "other_layout" 
    else 
     "application" 
    end 
    end 
end 
+21

Cool, danke. Und falls jemand mit einem Liner einfachere Dinge machen möchte, ist folgendes möglich. Es ist einfach zu lesen und oben auf dem Controller zu platzieren. --- 'Layout Proc.new {['index', 'neu', 'create']. Include? (Action_name)? 'some_layout': 'other_layout'} ' – holli

+1

Würde dies einen großen Effekt auf die Anwendungsleistung haben, wenn verschiedene Layouts verschiedene css & js-Dateien verwenden? – Noz

+0

Dies ist nicht Thread-sicher. –

43

Sie können das Layout festlegen, für eine individuelle Aktion mit respond_to:

def foo 
    @model = Bar.first 
    respond_to do |format| 
     format.html {render :layout => 'application'} 
    end 
    end 
+0

Das ist für mich die flexiblere Antwort. Das Ausdünnen durch Anwenden von 'layout [...]" auf die Controller-Klasse lässt nur eine Anweisung effektiv zu. Wenn Sie mehr als zwei Layouts haben (z. B. admin, generic_app, tailored_app), werden Sie feststellen, dass "Render und/oder Redirect mehrmals in dieser Aktion aufgerufen wurden". und Sie haben keine andere Wahl, als diesen Vorschlag zu verwenden. – Jerome

+1

Diese Antwort ist die beste, ihre einfache und saubere im Gegensatz zur Verwendung von Methoden mit Schalter oder wenn Anweisungen im Inneren. – kev

+0

kann auch die erb-Datei und Layout beide angeben: 'format.html {render 'custom_index', Layout: 'Anwendung'}' in der gleichen Weise. –

167
class ProductsController < ApplicationController 
    layout "admin", only: [:new, :edit] 
end 

oder

class ProductsController < ApplicationController 
    layout "application", only: [:index] 
end 
+9

Das ist die richtige Antwort! –

+2

Nun, das Problem damit ist, dass Sie nicht auf Objekte wie current_user zugreifen können, um das Layout bedingt zu bestimmen –

+0

Dies ist die richtige Antwort, nicht über one – Jacky

8

Sie auch das Layout für Aktion festlegen können machen:

def foo 
    render layout: "application" 
end 
7

Verschiedene Wege Layout unter Controller angeben:

  1. Im folgenden Code wird application_1 Layout genannt unter indizieren und anzeigen Aktion des Benutzers Controller und Anwendungslayout (Standardlayout) wird für andere Aktionen aufgerufen.

    class UsersController < ApplicationController 
        layout "application_1", only: [:index, :show] 
    end 
    
  2. Im folgenden Code wird application_1 Layout für alle Aktion von Benutzer-Controller genannt.

    class UsersController < ApplicationController 
        layout "application_1" 
    end 
    
  3. Im folgenden Code wird application_1 Layout für Testaktion von Benutzer-Controller nur und für alle anderen Maßnahmen Anwendung Layout (default) genannt genannt wird.

    class UsersController < ApplicationController 
         def test 
         render layout: "application_1" 
         end 
        end 
    
Verwandte Themen