我有一个控制器动作可以从缓存中受益。但是,当我通过平常打开动作缓存时:
caches_action :myaction, :expires_in=>15.minutes
...不会调用缓存。看起来这是因为使用HTTP POST调用了该操作。对于使用HTTP GET调用的类似操作,缓存可以正常工作。
我意识到使用POST来执行此操作可能不是很好的样式并且会破坏资源路由约定 - 可能这也是为什么响应没有被缓存,即使它可能是。但是现在我坚持使用它,因为这是客户目前所做的事情,我无法轻易改变它。
那么,有没有办法强制缓存此方法,即使它是通过POST访问的?
编辑:我应该澄清一下POST没有副作用,所以缓存动作是安全的。它本来应该是一个GET,它只是不是,现在也不能轻易改变。此外,浏览器或代理不会缓存响应也无关紧要。
答案 0 :(得分:1)
每个帖子的帖子数据内容是否相同?我怀疑他们不是,这就是为什么行动不会缓存。
有两种方法可以解决这个问题:
1)忘记caches_action并在控制器内轻松使用Rails.cache来缓存控制器代码的昂贵部分
2)使用Rack Middleware / Metal Endpoint从其他应用程序接收发布数据,并将数据刷入您想要的形状。
修改强>
我正在运行Rails 2.3.3,我可以确认它确实缓存了POST请求
为了在开发过程中进行检查,请确保在development.rb中将perform_caching设置为true:
config.action_controller.perform_caching = true
还要确保在production.rb
中使用相同的内容我在我的控制器中使用以下内容测试了这种情况:
caches_action :index
def index
@listings = Listing.find(:all)
end
同时使用GET 和POST 请求按预期缓存。 此外,我尝试在我的帖子客户端上设置http标头Cache-Control:no-cache并且操作仍然缓存
如果你正在运行OSX,请使用这个很棒的工具http://ditchnet.org/httpclient/来创建GET和POST请求