2010-07-24 5 views

Répondre

4

Je pense qu'il devrait être dans le noyau, mais pour l'instant vous pouvez faire une méthode d'assistance:

def current_layout 
    controller.send :_layout 
    end 

il retournera actuellement utilisé le nom de la mise en page

+3

Cela est vrai dans le cas où vous ne rend pas manuellement une mise en page comme ceci: rendre: layout => 'application'. – xpepermint

0

Vous pouvez faire ce que je l'ai fait dans mon Ajax gem for Rails qui consiste à envelopper la méthode _render_layout:

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 

Ensuite, vous pouvez accéder à la valeur définie de votre point de vue (je suis sûr que vous avez accès à controll là-bas ...) ou dans votre contrôleur dans un after_filter, ce que je fais.

J'ai écrit un custom RSpec 2 matcher qui peut être utilisé pour tester le rendu de mise en page dans Rails 3.

5

Pour Rails 4:

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

Pour Rails 3.2:

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

Mais controller.send(:_layout).identifier retourne le chemin complet:

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

Pour que cela fonctionne dans Rails 3.2, c'est un peu plus compliqué que ce qui a été décrit précédemment. Si votre contrôleur déclare explicitement une mise en page, le résultat de controller.send(:_layout) est une chaîne, mais sinon, il s'agit d'un ActionView :: Template. Essayez ceci:

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

Ceci est faux - il obtient ce que le contrôleur définit, mais pas un ensemble avec 'render: layout'. –

2

J'ai utilisé dans Rails4 à des pages de vue et ai obtenu reuslt.

controller.send(:_layout) 

J'espère que cette aide. enter image description here

2

dans des rails 5

qui travaille avec moi

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

L'OP a demandé une version différente de ce que vous montrez ici. Etes-vous sûr qu'ils seront comparables puisque apparemment aller de 2 à 3 ne l'est pas. – Mike

Questions connexes