【发布时间】:2011-03-20 14:06:01
【问题描述】:
【问题讨论】:
标签: layout views ruby-on-rails-3
【问题讨论】:
标签: layout views ruby-on-rails-3
让它在 Rails 3.2 中工作比之前概述的要复杂一些。如果你的控制器显式声明了一个布局,那么controller.send(:_layout) 的结果是一个字符串,否则它是一个 ActionView::Template。试试这个:
module ApplicationHelper
def current_layout
layout = controller.send(:_layout)
if layout.instance_of? String
layout
else
File.basename(layout.identifier).split('.').first
end
end
end
【讨论】:
render :layout的设置。
对于 Rails 4:
controller.send(:_layout)
=> 'application'
对于 Rails 3.2:
controller.send(:_layout)
=> #<ActionView::Template:0x000000082bb788>
但controller.send(:_layout).identifier 返回完整路径:
/home/davidm/Documentos/Devel/myapp/app/views/layouts/application.haml
【讨论】:
在轨道 5 中
这对我有用:
def current_layout
layout = controller.class.send(:_layout)
if layout.nil?
default_layout
elsif layout.instance_of? String or layout.instance_of? Symbol
layout
else
File.basename(layout.identifier).split('.').first
end
end
【讨论】:
controller.send(:_layout, [])
我认为它应该在核心,但现在你可以制作一个辅助方法:
def current_layout
controller.send :_layout
end
它将返回当前使用的布局名称
【讨论】:
对于轨道 5:
controller.class.send(:_layout)
这不起作用:
controller.send(:_layout)
【讨论】:
你可以做我在Ajax gem for Rails 中所做的事情,即包装_render_layout 方法:
ActionView::Base.class_eval do
def _render_layout_with_tracking(layout, locals, &block)
controller.instance_variable_set(:@_rendered_layout, layout)
_render_layout_without_tracking(layout, locals, &block)
end
alias_method_chain :_render_layout, :tracking
end
然后您可以访问从您的视图中设置的值(我很确定您可以访问那里的控制器...)或在 after_filter 中的控制器中设置的值,这就是我所做的。
我写了一个custom RSpec 2 matcher,可以用来测试 Rails 3 中的布局渲染。
【讨论】:
前面答案中的所有方法都尝试通过私有方法猜测名称,但无需猜测,使用公共 API 即可轻松完成:
class ApplicationController
layout :set_layout
attr_reader :layout_name
helper_method :layout_name
private
def set_layout
@layout_name = "application"
end
end
在不使用标准布局的任何控制器中覆盖:
class MyController < ApplicationController
private
def set_layout
@layout_name = "my_layout"
end
end
现在在你看来:
<%= layout_name %>
【讨论】: