Jer*_* B. 5 layout templates ruby-on-rails
我有一个场景,我希望在布局文件中有渲染视图的名称.我可以找到解决方案来查找哪个布局将从视图中包装当前视图,但不是相反.如何查找正在渲染的视图?
在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
Run Code Online (Sandbox Code Playgroud)
然后在布局中使用@last_template.
以下解决方案适用于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
Run Code Online (Sandbox Code Playgroud)