【问题标题】:Conditional layout and action caching without a layout没有布局的条件布局和动作缓存
【发布时间】:2012-03-22 01:06:19
【问题描述】:

我在使用动作缓存的控制器上有一个动作。但是,我在该缓存调用上使用了layout: false 标志,因为我的布局具有用户相关信息,例如登录状态。这非常有效。

然后我添加了 pjax-rails gem,它基本上将这段代码添加到控制器中:

layout ->(c) { pjax_request? ? false : 'application' }

这是在某些请求上不呈现布局。现在我(有点合乎逻辑地)想将这两种方法结合在一起。

但是当pjax_request? == true 我得到这个错误:

MyController 没有默认布局

我做错了什么,我该如何解决这个问题?


PS:在这种情况下,这是最容易重现的:

class MyController < ApplicationController
  layout false
  caches_action :index, :layout => false

  def index
  end
end

【问题讨论】:

    标签: ruby-on-rails caching ruby-on-rails-3.1 pjax


    【解决方案1】:

    我几乎认为这可能是 Rails 中的一个错误。查看actionpack/lib/action_controller/caching/actions.rb 的第 143 行附近的这段代码:

    body = controller.read_fragment(cache_path.path, @store_options)
    
    unless body
      controller.action_has_layout = false unless @cache_layout
      yield
      controller.action_has_layout = true
      body = controller._save_fragment(cache_path.path, @store_options)
    end
    
    body = controller.render_to_string(:text => body, :layout => true) unless @cache_layout
    
    controller.response_body = body
    

    看起来它在第一个 unless 块中正确地渲染了 没有 布局的主体,但随后它强制模板渲染 with 布局作为响应体。如果您查看堆栈跟踪,就会发现导致异常的那一行。

    我手动将文件编辑为:layout =&gt; @cache_layout(它总是评估为:layout =&gt; false,因为它由unless 保护)并且视图按预期呈现。

    除了自己临时修补该文件并打开错误报告之外,我不确定您能做些什么。我也可能对那条线的行为有误,但它确实看起来像是罪魁祸首。

    【讨论】:

    【解决方案2】:

    对于将来遇到此问题的任何人,从 rails 3 开始,为控制器设置默认布局:

    layout "application"
    

    http://apidock.com/rails/AbstractController/Layouts/ClassMethods/layout

    好像解决了这个问题,确实是rails缺陷。

    【讨论】:

      【解决方案3】:

      我也想提供一个解决方案,如果您这样做,它将解决您的问题:

      layout Proc.new {|controller|
        controller.action_has_layout = false
        false
      }
      

      从@Brandan 的回答中强制使用action_has_layout

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 2019-09-10
        • 2020-06-13
        • 2019-03-03
        • 2019-03-18
        相关资源
        最近更新 更多