Often when it calls to render JSON to the browser it's a bit too easy to do
respond_with(@posts = current_user.posts)
and leave it at that. Soon you'll override
as_json and eventually, given a complex enough application, you'll have presentation logic in the model and the controller.
Fortunately this problem is solved with JBuilder.
From the README:
Jbuilder gives you a simple DSL for declaring JSON structures that beats massaging giant hash structures. This is particularly helpful when the generation process is fraught with conditionals and loops.
I won't paste the full example from the README, but a quick preview:
json.content format_content(@message.content) json.(@message, :created_at, :updated_at) json.author do |json| json.name @message.creator.name.familiar json.email_address @message.creator.email_address_with_name json.url url_for(@message.creator, format: :json) end if current_user.admin? json.visitors calculate_visitors(@message) end
About 6 months ago I switched one of our larger applications over to JBuilder and so far it's been a dream. Having JSON view partials is incredibly powerful and this has allowed for a lot of code sharing between different parts of our API. It also means I've been able to remove a lot of ugly hash manipulation code from models and controllers.
If you're working with JSON I strongly recommend you make the switch to JBuilder. Especially on new projects.
If you're currently doing something similar with ERB or another system, I recommend a look at JBuilder. The Builder-like DSL is very nice and integrates super nicely with presentation logic.