Layout Rails3在视图内获取当前布局名称

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_

我有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_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)