我在使用JSON响应json请求时遇到问题,同时启用了操作缓存。
我有一个相当简单的控制器,它响应JSON和HTML,缓存适用于HTML响应,但我注意到当我请求JSON时,通常会使用JSON响应,但启用了动作缓存,它会包装JSON输出在布局中!
当我清除缓存时,它会给出一个错误,表明不存在默认布局:
ClipsController中的ArgumentError #index
...中的ClipsController没有默认布局。
如何为缓存操作返回JSON?
更新,我怀疑布局错误与我缓存操作的方式有关:
caches_action :index, :layout => false
我不确定,为什么在JSON响应的情况下仍然需要布局,因为没有缓存就没有问题。
暂时我已经修改了缓存过滤器以不缓存JSON请求,但这不是一个理想的解决方法,如果我想缓存JSON该怎么办?
caches_action :index, :layout => false, :if => Proc.new { |c| !c.request.format.json? }
答案 0 :(得分:1)
看起来这可能实际上是一个动作缓存的错误,但也许有一些我不理解的东西。
请参阅this line,了解它出错的地方。基本上,如果你将layout选项设置为false,它就不关心了,并试图用布局渲染它。
答案 1 :(得分:0)
我遇到了类似的问题(通过ajax请求呈现HTML,布局设置为false但存在)
这是一个解决方法:创建一个空布局并使用它来提供ajax请求
# app/views/layout/empty.html.erb
<%= yield %>
# controller
class FooController ...
layout Proc.new { |controller| controller.request.xhr? ? "empty" : "your normal html layout" }
caches_action ...
end