3

我在使用动作缓存的控制器上有一个动作。但是,我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
4

3 回答 3

2

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

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布局的主体,但随后它强制模板以布局作为响应主体的一部分进行渲染。如果您查看堆栈跟踪,那就是导致异常的行。

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

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

于 2012-03-07T01:11:43.860 回答
1

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

layout "application"

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

似乎克服了这个问题,那确实是rails的缺陷。

于 2013-01-21T18:30:56.203 回答
0

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

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

只是强制action_has_layout来自@Brandan的回答

于 2014-02-19T14:56:20.003 回答