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.