У меня есть ответ для Rails 2.X, но не для Rails 3. Как я могу прочитать имя текущего макета, созданного внутри представления.Rails3 получить текущее имя макета внутри вида
Мой Rails2 вопрос: Rails Layout name inside view
Thx.
У меня есть ответ для Rails 2.X, но не для Rails 3. Как я могу прочитать имя текущего макета, созданного внутри представления.Rails3 получить текущее имя макета внутри вида
Мой Rails2 вопрос: Rails Layout name inside view
Thx.
Я думаю, что это должно быть в ядре, но теперь вы можете сделать вспомогательный метод:
def current_layout
controller.send :_layout
end
он будет возвращать в настоящее время используется имя макета
Вы можете делать то, что я сделал в моей 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.
Для 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
Получение этого для работы в 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
Это неправильно - он получает то, что задает контроллер, но не один набор с 'render: layout'. –
в рельсах 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
ОП спросил о другой версии, чем то, что вы здесь показываете. Вы уверены, что они будут сопоставимы, поскольку, по-видимому, от 2 до 3 нет. – Mike
Это справедливо в случае, если вы вручную не делают макет, как это воздай: макет => «приложения». – xpepermint