12

我在使用 JSON 响应 json 请求时遇到问题,同时启用了动作缓存。

我有一个相当简单的控制器,它同时响应 JSON 和 HTML,并且缓存适用于 HTML 响应,但我注意到当我请求 JSON 时,通常会使用 JSON 响应,但启用动作缓存后,它将 JSON 输出包装在布局中!

当我清除缓存时,它给了我一个不存在默认布局的错误:

ClipsController#index 中的参数错误

ClipsController 在...中没有默认布局

如何为缓存的操作返回 JSON?

更新,我怀疑有关布局的错误与我缓存操作的方式有关:

caches_action :index, :layout => false

不过我不确定,为什么在 JSON 响应的情况下它仍然需要布局,因为没有缓存就没有问题。

暂时我已将缓存过滤器修改为不缓存 JSON 请求,但这不是一个理想的解决方法,如果我确实想缓存 JSON,我该怎么办?

caches_action :index, :layout => false, :if => Proc.new { |c| !c.request.format.json? }

4

2 回答 2

1

似乎这实际上可能是动作缓存的错误,但也许有一些我不理解的东西。

看到这条线,看看哪里出错了。基本上,如果您将布局选项设置为 false,它并不关心,并且无论如何都会尝试使用布局来呈现它。

于 2012-12-29T10:21:47.367 回答
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
于 2013-05-24T10:48:24.297 回答