我有一个模型,我们称之为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号的新书。
有没有办法在保存时处理客户端的错误?
答案 0 :(得分:1)
Spine的手册声明:
如果验证在服务器端失败,则在客户端验证逻辑中出错,而不是用户输入。
我不知道这如何能够轻松满足您的独特性要求。如果您可以将可能影响验证的所有数据库数据加载到客户端和,您可以以某种方式避免所有多用户竞争条件,可能可行。
您可以捕获“ajaxError”事件并告诉用户重试,尽管捕获“ajaxError”违反了手册中的建议。 IIRC您可能还需要对对象ID进行一些操作,以使Spine相信新记录实际上并未创建。
此外,您可以在用户编辑数据时触发先发制人验证请求,但这只是为了方便用户。理论上,在用户点击保存之前,您仍然可以遇到其他人创建冲突记录的竞争条件。
我个人转而使用Backbone,因为我发现Spine对错误处理的粗心态度太可怕了。