Search code examples
ruby-on-railsjson-api

Getting `uninitialized constant JsonapiCompliable::Adapters::ActiveRecord)` after adding jsonapi-suite


How do I make JsonapiCompliable::Adapters::ActiveRecord available?

$ curl localhost:3001/groups

Yields this:

ActionController::RoutingError (uninitialized constant JsonapiCompliable::Adapters::ActiveRecord):

app/resources/application_resource.rb:9:in `<class:ApplicationResource>'
app/resources/application_resource.rb:5:in `<main>'
app/resources/group_resource.rb:1:in `<main>'
app/controllers/groups_controller.rb:3:in `<class:GroupsController>'
app/controllers/groups_controller.rb:1:in `<main>'

I've added this code to my existing Rails 5.2.0 project :

Gemfile

gem 'jsonapi_suite', '~> 0.7'
gem 'jsonapi-rails', '~> 0.3.0'
gem 'jsonapi_swagger_helpers', '~> 0.6', require: false
gem 'jsonapi_spec_helpers', '~> 0.4', require: false
gem 'kaminari', '~> 1.0'

ApplicationController

 class ApplicationController < ActionController::API
+  # Bootstrap jsonapi_suite with relevant modules
+  include JsonapiSuite::ControllerMixin
+
+  register_exception JsonapiCompliable::Errors::RecordNotFound,
+    status: 404
+
+  # Catch all exceptions and render a JSONAPI-compliable error payload
+  # For additional documentation, see https://jsonapi-suite.github.io/jsonapi_errorable
+  rescue_from Exception do |e|
+    handle_exception(e)
+  end
+

GroupsController

class GroupsController < ApplicationController
  jsonapi resource: GroupResource

  strong_resource :group
  before_action :apply_strong_params, only: [:create, :update]

  def index
    groups = Group.all
    render_jsonapi(groups)
  end

  def show
    scope = jsonapi_scope(Group.where(id: params[:id]))
    instance = scope.resolve.first
    raise JsonapiCompliable::Errors::RecordNotFound unless instance
    render_jsonapi(instance, scope: false)
  end

  def create
    group, success = jsonapi_create.to_a

    if success
      render_jsonapi(group, scope: false)
    else
      render_errors_for(group)
    end
  end

  def update
    group, success = jsonapi_update.to_a

    if success
      render_jsonapi(group, scope: false)
    else
      render_errors_for(group)
    end
  end

  def destroy
    group, success = jsonapi_destroy.to_a

    if success
      render json: { meta: {} }
    else
      render_errors_for(group)
    end
  end
end

app/resources/group_resource.rb

   class GroupResource < ApplicationResource
     type :groups
   end

Debugging from console

[4] pry(main)> JsonapiCompliable::Adapters
=> JsonapiCompliable::Adapters
[5] pry(main)> JsonapiCompliable::Adapters::ActiveRecord
NameError: uninitialized constant JsonapiCompliable::Adapters::ActiveRecord

So, why isn't JsonapiCompliable::Adapters::ActiveRecord available?

app/resources/application_resource.rb

class ApplicationResource < JsonapiCompliable::Resource
  use_adapter JsonapiCompliable::Adapters::ActiveRecord
end

Solution

  • Add

    require 'jsonapi_compliable/adapters/active_record'
    

    to config/initializers/jsonapi.rb. You'll see this if you run the generators from the Quickstart.