Layout Rails3在视图内获取当前布局名称
我有Rails2.X的答案,但没有Rails3的答案。如何读取视图中呈现的当前布局的名称 我的问题2:Layout Rails3在视图内获取当前布局名称,layout,views,ruby-on-rails-3,Layout,Views,Ruby On Rails 3,我有Rails2.X的答案,但没有Rails3的答案。如何读取视图中呈现的当前布局的名称 我的问题2: Thx.我认为它应该在core中,但现在您可以创建一个helper方法: def current_layout controller.send :_layout end 它将返回当前使用的布局名称您可以执行我在中所做的操作,即包装\u render\u layout方法: ActionView::Base.class_eval do def _render_
Thx.我认为它应该在core中,但现在您可以创建一个helper方法:
def current_layout
controller.send :_layout
end
它将返回当前使用的布局名称您可以执行我在中所做的操作,即包装
\u render\u 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\u filter
,这就是我所做的
我已经编写了一个用于测试Rails 3中的布局渲染的程序。对于Rails 4:
controller.send(:_layout)
=> 'application'
对于Rails 3.2:
controller.send(:_layout)
=> #<ActionView::Template:0x000000082bb788>
在Rails 3.2中实现这一点比之前概述的要复杂一些。如果控制器显式声明布局,则
controller.send(:\u 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
我在Rails4中使用了查看页面,并获得了重用
controller.send(:_layout)
我希望这能有所帮助。在rails 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
前面答案中的所有方法都试图通过私有方法猜测名称,但无需猜测,并且可以通过公共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
class MyController
现在在你看来:
<%= layout_name %>
对于rails 5:
controller.class.send(:_layout)
这不起作用:
controller.send(:_layout)
如果您没有像下面这样手动呈现布局:render:layout=>'application'。OP询问的版本与此处显示的不同。你确定它们是可比较的,因为从2到3显然不是。这在Rails 5.0.1*
controller.send(:_layout,[])上也适用于我。这是错误的-它得到了控制器设置的内容,但没有一个带有render:layout
的设置。
controller.send(:_layout)