Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3, find current view while in the layout

I have a scenario where I would like to have the name of the view that will be rendering while I'm in the layout file. I can find solutions to find which layout will be wrapping the current view from the view, but not the other way around. How can I find which view is rendering?

like image 988
Jeremy B. Avatar asked Feb 11 '11 20:02

Jeremy B.


2 Answers

In Rails 3.0.3, I was able to see the name of the controller and action using controller_name and action_name. But those are not publicly documented (at least the action name) so I wouldn't depend on it long-term.

It might be better to monkey patch template render. In an initializer:

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

Then use @last_template in your layout.

like image 77
Brian Deterling Avatar answered Nov 15 '22 09:11

Brian Deterling


The following solution works in Rails 3.1. Place this code in an initializer. (The rails 3.0.3 answer is not working any more in Rails 3.1)

This enables an @active_template variable for every controller. This is an instance of an ActionViewTemplate class.

The method active_template_virtual_path method returns the template as a name in the following form "controller/action"


    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
like image 31
gamecreature Avatar answered Nov 15 '22 09:11

gamecreature