Backbone.js服务器端验证和其他服务器端错误

时间:2011-07-13 20:09:15

标签: ruby-on-rails backbone.js

如何在遇到服务器端错误(例如验证错误)时回滚模型更改?

鉴于必须在服务器端进行某些验证,使用backbone.js(Rails后端)执行此操作的适当方法是什么?

保存骨干模型时,如果验证失败,则会触发客户端验证,从而提供适当的用户体验(该模型的视图不会更新)。但是,如果服务器端验证失败,则在PUT到服务器之前,模型及其所有视图都已更新(使用无效数据)。

这似乎有一些问题。

  1. 在模型经过服务器端验证之前,所有视图都会更新。 例如,如果您有一个带有弹出编辑的模型列表 对话框,列表中的模型可能会更新 调用Model.save之后但在它之前调用不可验证的信息 经过服务器端验证和PUT'ed。
  2. 如果服务器返回错误(例如422错误),则不会发生模型的“回滚”。不可验证的数据就像粪便一样坐在那里。这真的很糟糕。
  3. 我使用backbone.js错了吗?是否有一种众所周知的方法来处理这种(非常常见的)情景?我知道我可以对旧值进行一些手动缓存等,但这是一种有臭味的解决方案。

    谢谢!

2 个答案:

答案 0 :(得分:5)

不知道我是否做错了(BackboneJS的新手),但我遇到了同样的问题,这就是我解决它的方法:

  • 我在服务器端执行所有验证

  • 我没有进行正常的model.save,而是对服务器进行标准的ajax调用,并返回包含已修改模型属性的错误消息或成功消息。如果成功,我可以使用返回的属性执行model.set,以便更新模型和相应的视图。

  • 如果你想先做客户端验证,我想你可以用{silent:true}选项进行保存,这样就不会更新视图,然后进行ajax调用,看看有什么需要根据响应完成(如果错误则恢复模型的原始值或如果成功则更新视图)

希望这有帮助。

ps:这有效,但感觉不到“干净”。如果有更好的解决方案,我也很乐意阅读它

答案 1 :(得分:0)

我要做的是在服务器端确保捕获任何错误,然后从数据库返回原始记录的响应查询,并将其作为JSON返回以及错误响应。然后你可以这样做:

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

假设您的观点正在观察模型上的更改事件,它们将相应地更新。