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

スパインのマニュアルの主張:

検証がサーバー側で失敗した場合は、ユーザー入力ではなく、クライアント側の検証ロジックのエラーです。

これがあなたの一意性の要件でどのように簡単に機能するかわかりません。検証に影響を与える可能性のあるすべてのデータベース データをクライアント側にロードでき、何らかの方法ですべてのマルチユーザー競合状態を回避できる場合は、実行できる可能性があります

「ajaxError」イベントをキャッチしてユーザーに再試行するように指示できますが、「ajaxError」をキャッチすることはマニュアルの推奨事項に反します。IIRC では、新しいレコードが実際には作成されていないことを Spine に納得させるために、オブジェクト ID を調整する必要がある場合もあります。

さらに、ユーザーがデータを編集しているときにプリエンプティブな検証リクエストを起動できますが、これはユーザーの便宜のためです。理論的には、ユーザーが保存を押す直前に他の誰かが競合するレコードを作成するという競合状態に陥ることがあります。

個人的には、エラー処理に対する Spine の不注意な態度が怖すぎると感じたので、Backbone に切り替えました。

于 2013-02-16T17:07:55.533 に答える