10

I have a controller index action which returns json output.

render :json => my_array.to_json

What type of caching do I have to use here. Does 'page caching' make sense for this.

Or do I have to do action caching like below

caches_action :index
iwasrobbed
  • 46,496
  • 21
  • 150
  • 195
user290870
  • 1,591
  • 3
  • 19
  • 27

2 Answers2

4

Either action caching or page caching would work fine; page caching would have the benefit of never calling the Rails stack, but it depends on whether you need to control who accesses that Json feed.

I'm a big fan of using page caching if you can get away with it - there are big savings on system resources to be had. :)


EDIT: Page caching example, in case there was any confusion:

class SomeController < ApplicationController
  caches_page :index
  def index
    render :json => my_array.to_json
  end
end

Unless I've misunderstood something, that should be all you need to do.

robotmay
  • 1,318
  • 14
  • 22
  • how do I specify page caching for json. I don't have any template in my view? – user290870 May 12 '10 at 07:33
  • You should just be able to specify it in the controller, added the code to my answer. – robotmay May 12 '10 at 07:41
  • thanks!. I thought page caching required the name of the view being cached as the argument to 'caches_page' instead of the action. – user290870 May 12 '10 at 08:10
  • Ah ha, an easy mistake to make. Glad that's working for you. :) – robotmay May 12 '10 at 08:20
  • 2
    However, it won't be served with the correct Content-Type. For that you need to adjust your virtual host (if using Apache, for example) to specify that content type, or manually cache the JSON and serve it from your action. – Matthew Ratzloff Oct 25 '11 at 22:52
2

Same considerations should apply to JSON as any other output. If you need to validate access to the data for the user, then action caching is the way to go, otherwise page caching should be fine.

If the data changes due to logic in your app, then both forms of caching are problematic and you are better off using something else.

Toby Hede
  • 36,755
  • 28
  • 133
  • 162