SpineJS处理服务器端rails模型验证

时间:2013-02-16 16:31:54

标签: ruby-on-rails ruby-on-rails-3 javascriptmvc spine.js

我有一个模型,我们称之为Book。在rails中,当Book保存时,我会验证它的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号的新书。

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

1 个答案:

答案 0 :(得分:1)

Spine的手册声明:

  

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

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

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

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

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