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.