Проверка на стороне сервера Backbone.js и другие ошибки на стороне сервера

Как вы откатываете изменения модели при столкновении с ошибками на стороне сервера (например, ошибки проверки)?

Учитывая, что определенная проверка должна выполняться на стороне сервера, каков подходящий способ сделать это с помощью backbone.js(бэкэнд Rails)?

При сохранении магистральной модели происходит проверка на стороне клиента, которая дает соответствующий пользовательский опыт, если проверка не выполняется (представления этой модели не обновляются). Однако, если проверка на стороне сервера не удалась, модель и все ее представления уже были обновлены (с недопустимыми данными) до PUT на сервере.

Кажется, с этим связано несколько проблем.

  • Все представления обновляются до того, как модель была проверена на стороне сервера. Если, например, у вас есть список моделей с всплывающим правлением диалога, модель в списке обновляется потенциально недействительной информации после вызова модели Model.save, но до того, как она был проверен на стороне сервера и PUT'ed.
  • Если сервер возвращает ошибку (например, ошибка 422), не происходит "откат" модели. Неразрешимые данные просто сидят там, как дерьмо. Это действительно плохой.

Я использую backbone.js неправильно? Есть ли известный способ справиться с этим (очень распространенным) сценарием? Я понимаю, что могу выполнить ручное кэширование старых значений и т.д., Но это своего рода вонючее решение.

Спасибо!

Ответ 1

Не знаю, делаю ли я это неправильно (новичок в BackboneJS), но у меня была такая же проблема, и вот как я ее решил:

  • Я выполняю все мои проверки на стороне сервера

  • Вместо того, чтобы делать нормальную model.save, я делаю стандартный вызов ajax на сервер и возвращаю сообщение об ошибке или сообщение об успешном завершении, содержащее атрибуты модифицированной модели. Если это удастся, я могу сделать model.set с возвращенными атрибутами, чтобы обновить модель и соответствующее представление.

  • Если вы хотите сначала выполнить проверку на стороне клиента, я думаю, вы могли бы сохранить с помощью опции {silent: true}, чтобы представления не обновлялись, затем выполняли вызов ajax и выясняли, какие потребности выполняться в соответствии с ответом (восстановить исходные значения для модели, если ошибки или обновления отображаются в случае успеха)

Надеюсь, что это поможет.

ps: это работает, но не чувствует себя "чистым". Если есть лучшее решение, я также хотел бы прочитать его

Ответ 2

Что бы я делал, это на стороне сервера, убедитесь, что вы уловили какие-либо ошибки и перед возвратом ответа на запрос для исходной записи из БД и возвращаете это как JSON вместе с ответом об ошибке. Тогда вы можете просто сделать это:

model.save({}, {
  error: function(model, response){
    model.set(response);
  }
});

Предполагая, что ваши представления затем просматривают события изменений в модели, они будут соответствующим образом обновляться.