是否可以从内部布局中获取当前渲染视图的名称?
6 回答
我为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 %>" >
用于<% __FILE__ %>
获取当前视图的完整文件路径,但您只能从文件本身内部使用它,而无需编写一些帮助程序
方法 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
我有一个类似的问题。我找到<%= params[:controller] %>
并<%= params[:action] %>
满足我的需要,即在 body 标记上添加控制器名称和动作名称作为类。
以防万一对任何人有帮助。:)
我目前正在使用 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
出于调试目的,您可以使用 gem 'current_template' from here。
此 gem 检查日志文件并显示视图/部分模板的文件名。
例如:
此外,您可以简单地添加这一行
<%= "#{`tail log/development.log`}".scan(/\s[a-z]+\/\S+/) %>
到您的布局/application.html.erb。