Rails 3, найти текущий вид в макете - PullRequest
5 голосов
/ 11 февраля 2011

У меня есть сценарий, в котором я хотел бы иметь имя представления, которое будет отображаться, пока я нахожусь в файле макета.Я могу найти решения, чтобы найти, какой макет будет обтекать текущее представление из представления, но не наоборот.Как я могу найти, какой вид рендеринга?

Ответы [ 3 ]

6 голосов
/ 12 февраля 2011

В Rails 3.0.3 я смог увидеть имя контроллера и действие, используя controller_name и action_name. Но они не документированы публично (по крайней мере, название действия), поэтому я не буду зависеть от этого в долгосрочной перспективе.

Возможно, будет лучше, если обезьяна исправит шаблон рендера. В инициализаторе:

module ActionView::Rendering 
  alias_method :_render_template_original, :_render_template
  def _render_template(template, layout = nil, options = {}) 
    @last_template = template
    _render_template_original(template, layout, options)
  end
end

Затем используйте @last_template в макете.

5 голосов
/ 29 ноября 2011

Следующее решение работает в Rails 3.1. Поместите этот код в инициализатор. (Ответ на rails 3.0.3 больше не работает в Rails 3.1)

Это включает переменную @active_template для каждого контроллера. Это экземпляр класса ActionViewTemplate.

Метод active_template_virtual_path возвращает шаблон в виде имени в следующей форме «контроллер / действие»


    class ActionController::Base
      attr_accessor :active_template

      def active_template_virtual_path
        self.active_template.virtual_path if self.active_template
      end
    end

    class ActionView::TemplateRenderer 

      alias_method :_render_template_original, :render_template

      def render_template(template, layout_name = nil, locals = {})

        @view.controller.active_template = template if @view.controller
        result = _render_template_original( template, layout_name, locals)
        @view.controller.active_template = nil if @view.controller
        return result

      end
    end
0 голосов
/ 11 февраля 2011

Мне нравится следующий подход, так как вы можете уменьшить размер кода во многих случаях.Включите это в ваш application_controller.rb:

  before_filter :instantiate_controller_and_action_names
  caches_action :instantiate_controller_and_action_names

  def instantiate_controller_and_action_names
    @current_action = action_name
    @current_controller = controller_name
  end

Затем, если ваши взгляды соответствуют действию, вы просто делаете:

dosomething if @current_action == 'new'
...