8

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

4

6 回答 6

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 %>" >
于 2013-07-09T08:18:29.430 回答
4

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

于 2014-05-19T23:03:11.550 回答
3

方法 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
于 2012-07-12T10:57:36.387 回答
1

我有一个类似的问题。我找到<%= params[:controller] %><%= params[:action] %>满足我的需要,即在 body 标记上添加控制器名称和动作名称作为类。

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

于 2014-03-01T17:07:45.573 回答
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
于 2015-01-26T02:08:00.170 回答
1

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

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

例如:

在此处输入图像描述

此外,您可以简单地添加这一行

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

到您的布局/application.html.erb。

于 2017-09-03T09:17:45.470 回答