Pluralization rules

Backbone.js предоставляет лёгкий и гибкий способ организации клиентского кода, но в нём есть ряд нюансов, связанных с автоматическим формированием URL для коллекций и моделей. Одним из таких нюансов является pluralization, то есть правила преобразования имени модели в форму множественного числа для построения URL коллекций.

Основной принцип

По умолчанию Backbone.js использует библиотеку Underscore.js и метод Backbone.Collection#url для определения URL коллекции. Если явно не указать URL, Backbone автоматически пытается получить его из имени модели, преобразуя его в множественное число:

var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
  model: Book
});

var books = new Books();
console.log(books.url); // => '/books'

Здесь класс модели называется Book. Backbone по умолчанию добавляет букву s к имени модели для формирования URL коллекции. Это работает для простых английских слов, но не для всех случаев.

Пользовательские правила множественного числа

Backbone позволяет определить свои собственные правила множественного числа, чтобы корректно формировать URL для моделей с нестандартными формами. Для этого используется объект Backbone.Collection.prototype.pluralize или метод Backbone.Model#urlRoot.

Пример настройки глобального правила pluralization:

Backbone.Collection.prototype.pluralize = function(name) {
  if (name === 'Person') return 'people';
  if (name === 'Child') return 'children';
  return name.toLowerCase() + 's';
};

var Person = Backbone.Model.extend({});
var People = Backbone.Collection.extend({
  model: Person
});

var people = new People();
console.log(people.url); // => '/people'

Здесь реализовано переопределение стандартного правила добавления s. Метод проверяет конкретные исключения и возвращает корректную форму для URL.

Локальная настройка pluralization для конкретной коллекции

Можно обойтись без глобальных изменений, задав локальное правило для одной коллекции через свойство url или метод url:

var Person = Backbone.Model.extend({});
var People = Backbone.Collection.extend({
  model: Person,
  url: function() {
    return '/people';
  }
});

var people = new People();
console.log(people.url()); // => '/people'

Использование функции url удобно, когда структура URL зависит от состояния коллекции или параметров запроса.

Взаимодействие с сервером

Правильное определение множественного числа критично для RESTful API, где URL коллекций должен соответствовать стандартам. Backbone ожидает следующие соответствия:

  • Модель/resource/:id
  • Коллекция/resources

Ошибки в pluralization могут привести к неправильным AJAX-запросам:

var Car = Backbone.Model.extend({});
var Cars = Backbone.Collection.extend({
  model: Car
});

var cars = new Cars();
console.log(cars.url); // если имя модели сложное, может быть '/cars' или некорректно

Для моделей с нестандартной формой множественного числа рекомендуется явное указание urlRoot для модели или url для коллекции.

Поддержка нестандартных языков

Backbone не предоставляет встроенной поддержки множественного числа для языков, отличных от английского. Для работы с русским или другими языками необходимо самостоятельно реализовать функцию pluralize с правилами для конкретного языка:

Backbone.Collection.prototype.pluralize = function(name) {
  switch (name) {
    case 'Книга': return 'книги';
    case 'Человек': return 'люди';
    default: return name.toLowerCase() + 's';
  }
};

Это позволяет использовать Backbone в многоязычных приложениях без конфликтов с URL и поддерживать RESTful-конвенции.

Рекомендации по использованию

  • Всегда проверять, что url коллекции соответствует REST API сервера.
  • Для моделей с исключениями в множественном числе использовать переопределение pluralize.
  • Для конкретной коллекции проще задать функцию url, чем глобально менять правила.
  • В многоязычных приложениях реализовать локализованную функцию pluralization.

Правильная настройка pluralization позволяет Backbone.js корректно формировать URL, минимизировать ошибки при работе с сервером и поддерживать чистую архитектуру клиентской части.