Rails动作缓存和json响应

时间:2012-08-11 22:35:00

标签: ruby-on-rails json memcached

我在使用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? }

2 个答案:

答案 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