Skip to content

Singleton Resource

Bill Heaton edited this page Jul 30, 2015 · 1 revision

Problem

The default naming for resources uses a plural naming convention. However the JSON API Specification does support the use case for a singular name of a resource/endpoint.

How do you setup a singleton resource with this library?

Solution

Use options to make a request that identifies the resource as a singleton.

An example route for the me resource:

export default Ember.Route.extend({
  model() {
    return store.find('me', { singleton: true });
  }
});

The generated initializer for a resource uses pluralization by default, so manually change the pluralized names to singular (the same value passed to the generator).

  • ember g resource me

Then change the mes to me:

import Service from '../services/me';
import Model from '../models/me';
import Adapter from '../adapters/me';
import Serializer from '../serializers/me';

export function initialize(container, application) {
  const adapter = 'service:me-adapter';
  const serializer = 'service:me-serializer';
  const service = 'service:me';
  const model = 'model:me';

  application.register(model, Model, { instantiate: false, singleton: false });
  application.register(service, Service);
  application.register(adapter, Adapter);
  application.register(serializer, Serializer);

  application.inject('service:store', 'me', service);
  application.inject(service, 'serializer', serializer);
}

export default {
  name: 'me-service',
  after: 'store',
  initialize: initialize
};

In the generated adapter be sure to use singular names to refer to the endpoint and resource type:

import ApplicationAdapter from './application';
import config from 'client/config/environment';

export default ApplicationAdapter.extend({
  type: 'me',
  url: config.APP.API_HOST + 'me'
});

Discussion

There is some manual updates that are necessary to support a Singleton Resource which fits into the JSON API Specification. It would be nice to have an automated way to generate a resource as a plural or singular name, but the common use is plural. Singleton resources can be used, by using the option { singleton: true } or { singleton: true, id: '111' } when requesting a resource.

Clone this wiki locally