/ /バックボーンモデル/コレクションでの不思議な動作、新しく作成されたモデルからIDを取得するにはどうすればよいですか? - ruby​​-on-rails、backbone.js

バックボーンモデル/コレクションでの不思議な動作、新しく作成されたモデルからIDを取得するにはどうすればよいですか? - ruby​​-on-rails、backbone.js

私は、backbone.jsとレール3.0.7(とcoffeescript)を使ってモデルを作成するときに奇妙な動作をしています。

私はモデルを作成します

@model = @collection.create
param : a_param
param : another_param

これはレールに保存され、戻りオブジェクトは私が期待しているものです(console.log @modelはid、cid、属性などを含む正しい見た目のバックボーンモデルを返します)。

私はconsole.log @ model.idを返すとき、それはundefinedを返します(console.log @modelにあったとしても)。

私がconsole.log @collectionを実行すると、期待されるコレクションが返されますが、console.log @ collection.modelsに空の配列が返されます。

jsonを使って@collectionを(レール)ページにロードすると、次のようになります。

( json_from_the_page : #{@collection.to_json} )

@collection = new CollectionName()
@collection.reset options.json_from_the_page

とconsole.log @ collection.modelsはすべて正常に動作するので、サーバに保存することと関係がありますか?

任意のアイデア、または私はバックボーンコードでさらにデバッグする必要がありますか?

回答:

回答№1は2

バックボーンのソースコードによれば、オブジェクトのIDは、構築中にIDを受け取る場合にのみ設定されます。 Rails IDを設定しているので、あなたがレールからそれを求めるとき、あなたは1つを得るが、あなたは新しいオブジェクトを構築するときにIDを取得しない。

これは設計によるものです。バックボーンは、標準IDがサーバーによって設定されることを前提としています。したがって、 "新しく作られた"モデルの場合、IDは自動的には設定されません(モデルのメソッド isNew() 返品 true)。

新しく作られたモデルにIDが必要な場合は、あなたのサーバがIDを提供できるように、即座にそれを保存してください(そして、保存が戻るまでそれを実行しないでください)。クライアント側で信頼できるプログラムIDをお持ちの場合は、 initialize() 属性フィールドに属性値が指定されていない場合は、属性値を作成中に指定します。


回答№2の場合は0

私は同じ問題に遭遇した。 私はモデルを保存してコレクションに追加しようとしていました。これはうまくいきましたが、ページをリフレッシュするまで新しく作成したモデルを操作することはできませんでした。モデルを保存していても、レールバックエンドによって作成されたIDはまだありませんでした。

この問題を解決するために、私はモデルを作成し、レールレスポンスに基づいて新しいモデルのidを設定し、次にそれをコレクションに追加します。以下のサンプルコード(coffeescriptで書かれています)を見てください。モデルの成功関数(エラー関数と同様に)を宣言しています。成功関数では、格納されたレールレスポンスを持つ@model ["attributes"] ["0"]にIDを取得しています。あなたの設定は少し異なるかもしれません。

attrs =
name: "model_name"

options =
success: (data, textStatus, jqXHR) =>
@model.set
id: @model["attributes"]["0"]["id"]
@collection.add(@model)
error: (jqXHR, textStatus, errorThrown) =>
alert "Failed to create model"

@model.save(attrs, options)