2010-07-24 9 views

Antwort

4

ich denke, es in Kern sein sollte, aber jetzt können Sie eine Hilfsmethode machen:

def current_layout 
    controller.send :_layout 
    end 

es derzeit Layoutnamen

+3

Dies gilt für den Fall, Sie nicht manuell ein Layout wie diese machen Sie: Render: layout => 'Anwendung'. – xpepermint

0

verwendet zurückkehren wird können Sie tun, was ich meine getan habe in Ajax gem for Rails die die _render_layout Methode zu wickeln ist:

ActionView::Base.class_eval do 
     def _render_layout_with_tracking(layout, locals, &block) 
     controller.instance_variable_set(:@_rendered_layout, layout) 
     _render_layout_without_tracking(layout, locals, &block) 
     end 
     alias_method_chain :_render_layout, :tracking 
    end 

Dann können Sie den Wert zugreifen, die aus Ihrer Sicht gesetzt wurde (ich bin mir ziemlich sicher, dass Sie Zugriff auf die controll haben ähm ... oder in deinem Controller in einer after_filter, was ich mache.

Ich habe ein custom RSpec 2 matcher geschrieben, die verwendet werden können, in das Layout-Rendering zu testen Rails 3.

5

Für Rails 4:

controller.send(:_layout) 
=> 'application'  

Für Rails 3.2:

controller.send(:_layout) 
=> #<ActionView::Template:0x000000082bb788> 

Aber controller.send(:_layout).identifier gibt den vollständigen Pfad zurück:

/home/davidm/Documentos/Devel/myapp/app/views/layouts/application.haml 
17

Die Implementierung in Rails 3.2 ist etwas komplizierter als zuvor beschrieben. Wenn Ihr Controller explizit ein Layout deklariert, ist das Ergebnis von controller.send(:_layout) ein String, ansonsten ist es ein ActionView :: Template. Versuchen Sie folgendes:

module ApplicationHelper 
    def current_layout 
    layout = controller.send(:_layout) 
    if layout.instance_of? String 
     layout 
    else 
     File.basename(layout.identifier).split('.').first 
    end 
    end 
end 
+0

Das ist falsch - es bekommt, was der Controller setzt, aber nicht ein Set mit 'render: layout'. –

2

Ich habe in Rails4 auf Ansichtsseiten verwendet und reuslt.

controller.send(:_layout) 

Ich hoffe diese Hilfe. enter image description here

2

in Schienen 5

, die mit mir arbeitet

def current_layout 
    layout = controller.class.send(:_layout) 
    if layout.nil? 
    default_layout 
    elsif layout.instance_of? String or layout.instance_of? Symbol 
    layout 
    else 
    File.basename(layout.identifier).split('.').first 
    end 
end 
+0

Das OP fragte nach einer anderen Version als die, die Sie hier zeigen. Sind Sie sicher, dass sie vergleichbar sein werden, da es offensichtlich nicht von 2 auf 3 geht? – Mike