是否可以使caches_action适用于通过HTTP POST访问的rails控制器方法?

时间:2009-08-08 14:29:46

标签: ruby-on-rails caching

我有一个控制器动作可以从缓存中受益。但是,当我通过平常打开动作缓存时:

  caches_action :myaction, :expires_in=>15.minutes

...不会调用缓存。看起来这是因为使用HTTP POST调用了该操作。对于使用HTTP GET调用的类似操作,缓存可以正常工作。

我意识到使用POST来执行此操作可能不是很好的样式并且会破坏资源路由约定 - 可能这也是为什么响应没有被缓存,即使它可能是。但是现在我坚持使用它,因为这是客户目前所做的事情,我无法轻易改变它。

那么,有没有办法强制缓存此方法,即使它是通过POST访问的?

编辑:我应该澄清一下POST没有副作用,所以缓存动作是安全的。它本来应该是一个GET,它只是不是,现在也不能轻易改变。此外,浏览器或代理不会缓存响应也无关紧要。

1 个答案:

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