I would like to restrict requests to all API controllers to being redirected to the JSON path. I would like to use a redirect since also the URL should change according to the response.
One option would be to use a before_filter
which redirects the request to the same action but forces the JSON format. The example is not working yet!
# base_controller.rb
class Api::V1::BaseController < InheritedResources::Base
before_filter :force_response_format
respond_to :json
def force_response_format
redirect_to, params[:format] = :json
end
end
Another option would be to restrict the format in the routes settings.
# routes.rb
MyApp::Application.routes.draw do
namespace :api, defaults: { format: 'json' } do
namespace :v1 do
resources :posts
end
end
end
I want all request to end up as a JSON request:
http://localhost:3000/api/v1/posts
http://localhost:3000/api/v1/posts.html
http://localhost:3000/api/v1/posts.xml
http://localhost:3000/api/v1/posts.json
...
Which strategy would you recommend?
Setting a default in your routes won't turn all requests into a JSON request.
What you want is to make sure that whatever you're rendering is a JSON response
You pretty much had it in the first option except you need to do this
before_filter :set_default_response_format
private
def set_default_response_format
request.format = :json
end
That would go under your Base API controller so that when it gets to your actual action the format will always be JSON.
If you want to return a 404, or raise a RouteNotFound error if the format is not :json
, I would add a route constraint like this:
Require JSON format:
# routes.rb
MyApp::Application.routes.draw do
namespace :api, constraints: { format: 'json' } do
namespace :v1 do
resources :posts
end
end
end
More information can be found here: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints
Second option, using routes format. If a user explicitly requests a XML format, he should not receive a JSON response. He should get a message saying that this URL doesn't answer to XML format, or 404.
By the way, it would be rather easy to respond to all which is what you should do in my opinion.
class FooController
respond_to :xml, :json
def show
@bar = Bar.find(params[:id])
respond_with(@bar)
end
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With