2010-07-24 6 views

ответ

4

Я думаю, что это должно быть в ядре, но теперь вы можете сделать вспомогательный метод:

def current_layout 
    controller.send :_layout 
    end 

он будет возвращать в настоящее время используется имя макета

+3

Это справедливо в случае, если вы вручную не делают макет, как это воздай: макет => «приложения». – xpepermint

0

Вы можете делать то, что я сделал в моей Ajax gem for Rails который обернуть _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 

Затем вы можете получить доступ к значению, которое было установлено с вашей точки зрения (я уверен, что у вас есть доступ к CONTROLL там ...) или в вашем контроллере в after_filter, что я и делаю.

Я написал custom RSpec 2 matcher, который может быть использован для тестирования макета визуализации в Rails 3.

5

Для Rails 4:

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

Для Rails 3.2:

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

Но controller.send(:_layout).identifier возвращается полный путь:

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

Получение этого для работы в Rails 3.2 немного сложнее, чем было описано ранее. Если ваш контроллер явно объявляет макет, то результатом controller.send(:_layout) является String, но в остальном это ActionView :: Template. Попробуйте следующее:

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

Это неправильно - он получает то, что задает контроллер, но не один набор с 'render: layout'. –

2

Я использовал в Rails4 на страницах просмотра и получил reuslt.

controller.send(:_layout) 

Я надеюсь, что эта помощь. enter image description here

2

в рельсах 5

, который работает со мной

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

ОП спросил о другой версии, чем то, что вы здесь показываете. Вы уверены, что они будут сопоставимы, поскольку, по-видимому, от 2 до 3 нет. – Mike

Смежные вопросы