2010-07-24 7 views

Respuesta

4

creo que debe ser en el núcleo, pero por ahora se puede realizar un método de ayuda:

def current_layout 
    controller.send :_layout 
    end 

que volverá utilizado actualmente nombre de la presentación

+3

Esto es cierto en el caso de que no se representan de forma manual un diseño como este: render: layout => 'aplicación'. – xpepermint

0

Usted puede hacer lo que he hecho en mi Ajax gem for Rails que es para envolver los _render_layout método:

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 

a continuación, se puede acceder al valor que se estableció desde su punto de vista (estoy bastante seguro de que tiene acceso a la controll er there ...) o en su controlador en un after_filter, que es lo que hago.

He escrito un custom RSpec 2 matcher que se puede utilizar para probar la representación diseño en Rails 3.

5

para los carriles 4:

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

para los carriles de 3,2:

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

Pero controller.send(:_layout).identifier devuelve el camino completo:

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

Hacer que esto funcione en Rails 3.2 es un poco más complicado de lo que se describió anteriormente. Si su controlador declara explícitamente un diseño, entonces el resultado de controller.send(:_layout) es un String, pero de lo contrario es una ActionView :: Template. Pruebe esto:

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

Esto está mal: obtiene lo que el controlador establece, pero no un conjunto con 'render: layout'. –

2

He utilizado en Rails4 en las páginas de vista y me he reutilizado.

controller.send(:_layout) 

Espero que esta ayuda. enter image description here

2

en los carriles 5

que funciona conmigo

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

El OP preguntó acerca de una versión diferente a la que está mostrando aquí. ¿Estás seguro de que serán comparables ya que aparentemente no va de 2 a 3? – Mike

Cuestiones relacionadas