1

我有一个模型,我们称之为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

在 Rails 中:

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

我的问题是,在我的 SpineJS 应用程序中,即使 Rails 服务器返回验证错误,它也会愉快地保存一本带有重复 ISBN 号的新书。

有没有办法在保存时处理这个错误客户端?

4

1 回答 1

1

Spine 的手册声称:

如果验证确实在服务器端失败,则这是客户端验证逻辑中的错误,而不是用户输入的错误。

我看不出这如何轻松满足您的独特性要求。如果您可以将所有可能影响验证的数据库数据加载到客户端,并且您可以以某种方式避免所有多用户竞争条件,那么它可能是可行的。

您可以捕获“ajaxError”事件并告诉用户重试,尽管捕获“ajaxError”违背了手册中的建议。IIRC 您可能还需要对对象 ID 进行一些处理,以使 Spine 相信实际上并未创建新记录。

此外,您可以在用户编辑数据时触发先发制人的验证请求,但这只是为了方便用户。从理论上讲,您仍然可以在用户点击保存之前遇到其他人创建冲突记录的竞争条件。

就我个人而言,我转而使用 Backbone,因为我发现 Spine 对错误处理的粗心态度太可怕了。

于 2013-02-16T17:07:55.533 回答