Before when I was using respond_to, I didn’t have to specify :location, but after switching to respond_with, I do, so I ran into that issue. From what I’ve read, location is only supposed to be required for a RESTful service specifically when :status is :created (with the location where you can go to get the resource) or :accepted (when further processing is needed on the request and I guess you are giving the location of where they can do to wait on it and eventually get it from that url). I understand that it may not be backwards compatible, but is there a way to not have to have it to be set to nil explicitly if it is unnecessary? From that bug, it looked like that would be a breaking change, so I’m wondering if something new should be considered for Rails 4?
How about something like (sorry for my bad function names- having trouble coming up with anything good):
Something that may call save/setup transaction, etc. goes here.
By wrapping this in a block the wrap method that yields this block could
do a begin … rescue around the yield and if StandardError rescued
it could set status :internal_server_error and return a generic json response
containing the error.
respond would be similar to respond_with/respond_to but is able
to look at @my_model.errors to determine if there are validation errors
in which case it would return :unprocessable_entity with the errors wrapped
in JSON for json format, etc., otherwise it would look at the request to
determine the operation type or you could pass :create, :destroy, :update,
etc. as an argument. Based on operation type would set status :created if in create,
head :no_content if destroy, status :ok if in update, show, index. And you
would specify status: :accepted if it is an async request. Would set the
location based on controller and action in request or use a specified location.
A really bad idea or not? I could write a gem for it easily if it were just a matter of adding a wrapping method and
convenience response method that could call respond_with/respond_to.