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.
Можно обойтись без глобальных изменений, задав локальное
правило для одной коллекции через свойство 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 позволяет Backbone.js корректно формировать URL, минимизировать ошибки при работе с сервером и поддерживать чистую архитектуру клиентской части.