Rails3 получает текущее имя макета внутри вида

У меня есть ответ для Rails 2.X, но не для Rails 3. Как я могу прочитать имя текущего макета, отображаемого внутри представления.

Мой вопрос Rails2: Название макета Rails внутри вида

спасибо.

Ответы

Ответ 1

Как это работает в 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

Ответ 2

Для 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

Ответ 3

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

 def current_layout
    controller.send :_layout
  end

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

Ответ 4

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

controller.send(:_layout)

Я надеюсь, что эта помощь. введите описание изображения здесь

Ответ 5

в рельсах 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

Ответ 6

Вы можете сделать то, что я сделал в 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

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

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