Rails: Restrict API requests to JSON format

JJD picture JJD · Feb 2, 2013 · Viewed 23.1k times · Source

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?

Answer

Leo Correa picture Leo Correa · Feb 2, 2013

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.