MikeL MikeL - 6 months ago 92
JSON Question

Rails JSON API layouts with Jbuilder (or other)

In my rails 3.2 app, I'm using jbuilder to render responses from my JSON api.

I want to provide a common structure to all API responses, and a layout would be the likely solution to keep my views DRY.

ex: I'd like every response to be of the following form :

{
status: "ok|error|redirect",
data: { ... JSON specific to the current view ... },
errors: [ ... ],
notes: [ ... ]
}


(where the value for data is a json structure provided by the view, everything else is from the layout)

However: I can't get the jbuilder layout yielding to the view correctly.

# in layout
json.data yield

# in view
json.some "value"


results in:

{"data":"{\"some\":\"value\"}"} # arg! my json has become a string


Trying things another way:

# in layout
yield

# in view
json.data do |json|
json.some "value"
end


results in :

{}


Has anyone had success doing this with jbuilder, or another json templating gem/method?

This juilder github issue suggests it's possible, but indicates others are having similar issues.

I see rabl (https://github.com/nesquena/rabl/) is supposed to support layouts (https://github.com/nesquena/rabl/wiki/Using-Layouts), but I've decided not to use it for other reasons (rabl makes complex json structures a nightmare, particularly when trying to control object roots etc).

Answer

You can do this by this way

# api.v1.json.jbuilder - layout
json.request do
  json.message "your message"
  json.status 200
end
json.data JSON.parse(yield)

# show.json.jbuilder - action view
json.name 'Some item name'