ruby-on-railsjsonrubyransackjsonapi-resources

Using Ransack in a Rails 5 API only application


I recently started working on a Rails 5 API only application and I included jsonapi-resources as well as ransack to easily filter the results for any given request. By default, jsonapi-resources provides basic CRUD functionality, but in order to insert the search parameters for ransack I need to overwrite the default index method in my controller:

class CarsController < JSONAPI::ResourceController

  def index
    @cars = Car.ransack(params[:q]).result
    render json: @cars
  end

end

Now, this works fine, but it no longer uses jsonapi-resources to generate the JSON output, which means the output changed from:

# ORIGINAL OUTPUT STRUCTURE
{"data": [
  {
    "id": "3881",
    "type": "cars",
    "links": {
      "self": ...
    },
    "attributes": {
      ...
    }
  }]
}

To a default Rails JSON output:

[{
  "id": "3881",
  "attr_1": "some value",
  "attr_2": "some other value"
}]

How can I keep the original output structure while patching the index method in this controller?


Solution

  • Try to use the gem https://github.com/tiagopog/jsonapi-utils. In your case the problem will be solved in this way:

    class CarsController < JSONAPI::ResourceController
      include JSONAPI::Utils
    
      def index
        @cars = Car.ransack(params[:q]).result
        jsonapi_render json: @cars
      end
    end