SpineJS обрабатывает валидацию модели rails на стороне сервера

У меня есть модель, назовем ее Book. В rails, когда книга сохраняется, я проверяю уникальность ее номера ISBN. Для моего внешнего интерфейса у меня есть простое приложение SpineJS, которое позволяет мне добавить новую книгу.

В SpineJS:

class App.Book extends Spine.Model
  @configure 'Book', 'name', 'isbn'
  @extend Spine.Model.Ajax

  validate: ->
    "Name required" unless @name
    "ISBN required" unless @isbn

И в рельсах:

class Book < ActiveRecord::Base
  attr_accessible :name, :isbn
  validates :name, :presence => true
  validates :isbn. :presence => true, :uniqueness => true
end

Моя проблема в том, что в моем приложении SpineJS оно с радостью сохраняет новую книгу с повторяющимся номером ISBN, даже если сервер Rails возвращает ошибки проверки.

Есть ли способ обработать эту ошибку на стороне клиента при сохранении?


person Pete Hamilton    schedule 16.02.2013    source источник


Ответы (1)


В руководстве Spine утверждается:

Если проверка не проходит на стороне сервера, это ошибка логики проверки на стороне клиента, а не пользовательского ввода.

Я не понимаю, как это может легко работать с вашим требованием уникальности. Это может работать, если вы сможете загрузить все данные базы данных, которые могут повлиять на проверку, на стороне клиента, и вы сможете каким-то образом избежать всех условий многопользовательской гонки.

Вы можете перехватить событие «ajaxError» и попросить пользователя повторить попытку, хотя перехват «ajaxError» противоречит рекомендациям в руководстве. IIRC вам также, возможно, придется немного поработать с идентификаторами объектов, чтобы убедить Spine в том, что новая запись на самом деле не была создана.

Кроме того, вы можете запускать запросы на упреждающую проверку, когда пользователь редактирует данные, но это делается только для удобства пользователя. Теоретически вы все равно можете столкнуться с состоянием гонки, когда кто-то другой создает конфликтующую запись непосредственно перед тем, как пользователь нажмет кнопку «Сохранить».

Лично я перешел на Backbone, так как меня слишком пугало небрежное отношение Spine к обработке ошибок.

person mpartel    schedule 16.02.2013
comment
Спасибо за это, я только что вернулся из Backbone, так как мне понравилась простота Spine, однако теперь я возвращаюсь обратно, так как для большого веб-приложения позвоночник кажется немного слишком тонким.. . - person Pete Hamilton; 16.02.2013