如何从Rails中的布局模板获取当前视图名称?

时间:2012-07-12 09:20:22

标签: ruby-on-rails-3

是否可以从布局中获取当前渲染视图的名称?

6 个答案:

答案 0 :(得分:4)

我为css命名空间做了类似的事情:

# config/initializers/action_view.rb
ActionView::TemplateRenderer.class_eval do

  def render_template_with_tracking(template, layout_name = nil, locals = {})
    # with this gsub, we convert a file path /folder1/folder2/subfolder/filename.html.erb to subfolder-filename
    @view.instance_variable_set(:@_rendered_template, template.inspect.gsub(/(\..*)/, '').split('/')[-2..-1].join('-'))
    out = render_template_without_tracking(template, layout_name, locals)
    @view.instance_variable_set(:@_rendered_template, nil)
    return out
  end

  alias_method_chain :render_template, :tracking
end


# application.html.erb
<body class="<%= :@_rendered_template %>" >

答案 1 :(得分:3)

方法active_template_virtual_path方法以下列形式“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

答案 2 :(得分:3)

使用<% __FILE__ %>获取当前视图的完整文件路径,但只能在 文件本身中使用它而无需编写一些帮助程序

答案 3 :(得分:1)

我有一个类似的问题。我发现<%= params[:controller] %><%= params[:action] %>符合我的需要,即将控制器名称和操作名称添加为body标签上的类。

以防万一可以帮助任何人。 :)

答案 4 :(得分:1)

我目前正在使用Peter Ehrlich解决方案的修改版本。结果字符串的格式为controller_name/view_name,例如users/new,这意味着它可以在以后直接传递给render,或者更改为适合其他用途。我只用Rails 4.2试过这个,虽然据我所知它应该一直回到3. x es。

ActionView::Base.class_eval do
  attr_accessor :current_template
end

ActionView::TemplateRenderer.class_eval do
  def render_template_with_current_template_accessor(template, layout_name = nil, locals = {})
    @view.current_template = template.try(:virtual_path)
    render_template_without_current_template_accessor(template, layout_name, locals)
  end

  alias_method_chain :render_template, :current_template_accessor
end

答案 5 :(得分:1)

出于调试目的,您可以使用here中的gem'current_template'。

此gem检查日志文件并显示视图/部分模板的文件名。

例如:

enter image description here

此外,您只需添加此行

即可

<%= "#{`tail log/development.log`}".scan(/\s[a-z]+\/\S+/) %>

到你的layout / application.html.erb。