【问题标题】:Rails3 get current layout name inside viewRails3在视图中获取当前布局名称
【发布时间】:2011-03-20 14:06:01
【问题描述】:

我有 Rails 2.X 的答案,但没有 Rails 3 的答案。如何读取视图中呈现的当前布局的名称。

我的 Rails2 问题:Rails Layout name inside view

谢谢。

【问题讨论】:

    标签: layout views ruby-on-rails-3


    【解决方案1】:

    让它在 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的设置。
    【解决方案2】:

    对于 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
    

    【讨论】:

      【解决方案3】:

      在轨道 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
      

      【讨论】:

      • OP 询问了与您在此处显示的版本不同的版本。您确定它们具有可比性吗,因为从 2 到 3 显然不是。
      • 这对我来说也适用于 Rails 5.0.1* controller.send(:_layout, [])
      【解决方案4】:

      我认为它应该在核心,但现在你可以制作一个辅助方法:

       def current_layout
          controller.send :_layout
        end
      

      它将返回当前使用的布局名称

      【讨论】:

      • 如果您不手动渲染这样的布局,这是正确的:render :layout => 'application'。
      【解决方案5】:

      我在 Rails4 中使用过 view pages 并得到了 reuslt。

      controller.send(:_layout)
      

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

        对于轨道 5:

        controller.class.send(:_layout)
        

        这不起作用:

        controller.send(:_layout)
        

        【讨论】:

          【解决方案7】:

          你可以做我在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 中的布局渲染。

          【讨论】:

            【解决方案8】:

            前面答案中的所有方法都尝试通过私有方法猜测名称,但无需猜测,使用公共 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 %>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-02-18
              • 1970-01-01
              • 1970-01-01
              • 2011-02-28
              • 2013-09-02
              • 2019-04-06
              • 2016-03-15
              相关资源
              最近更新 更多