Rails3 получает текущее имя макета внутри вида - PullRequest
13 голосов
/ 24 июля 2010

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

Мой вопрос по Rails2: Имя макета Rails из вида

Thx.

Ответы [ 8 ]

17 голосов
/ 25 февраля 2012

Работать с 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
6 голосов
/ 27 января 2012

для рельсов 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
4 голосов
/ 01 марта 2017

в рельсах 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
4 голосов
/ 28 июля 2010

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

 def current_layout
    controller.send :_layout
  end

вернет текущее имя макета

2 голосов
/ 13 мая 2016

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

controller.send(:_layout)

Надеюсь, это поможет. enter image description here

0 голосов
/ 26 февраля 2019

Для рельсов 5:

controller.class.send(:_layout)

Это НЕ работает:

controller.send(:_layout)
0 голосов
/ 09 октября 2018

Все подходы в предыдущих ответах пытаются угадать имя с помощью частных методов, но нет необходимости угадывать, и это легко сделать с помощью открытого API:

class ApplicationController
  layout :set_layout
  attr_reader :layout_name
  helper_method :layout_name

  private

  def set_layout
    @layout_name = "application"
  end
end

Переопределите в любом контроллере, который не будет использовать стандартную компоновку:

class MyController < ApplicationController
  private

  def set_layout
    @layout_name = "my_layout"
  end
end

А теперь в ваших представлениях:

<%= layout_name %>
0 голосов
/ 13 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...