0

多くのタスクを伴うモデルの予定があります。

タスクを持つ新しい予定モデルを作成すると、バックボーンで正常に機能します。しかし、モデルをさまざまなタスクの ID で更新しようとすると、機能しません。

次のエラーが表示されます。

ActiveRecord::AssociationTypeMismatch: Task(#1192000) expected, 
got ActiveSupport::HashWithIndifferentAccess(#2458300)

パラメーター:

{"appointment"=>
   {"id"=>"36",
    "customer_id"=>"19",
     "employee_id"=>"10",
     "done"=>"",
     "notes"=>"",
     "starts_at"=>"2012-09-05 13:00:00 +0200",
     "ends_at"=>"2012-09-05 14:30:00 +0200",
     "bookingtype"=>"",
     "tasks"=>
         "[{\"created_at\"=>\"2012-09-04T13:37:17+02:00\",
           \"duration\"=>\"60\", \"id\"=>\"12\",
           \"task_category_id\"=>\"5\", \"updated_at\"=>\"2012-09-04T13:46:13+02:00\"}]",
     "appointment"=>"",
     "task_ids"=>"[\"12\"]"},
     "action"=>"update",
     "controller"=>"appointments",
      "id"=>"36"}

リクエストに tasks と task_ids が含まれていることが問題であると考えていますが、バックボーンでそれを修正する方法がわかりません。

私の更新方法は次のようになります。

    save: function() {
            var self = this;        

            var tasks = [];

            $("input:checked").each(function() {                   
               tasks.push($(this).val());
            });

            this.model.save({starts_at: this.$('#appointment_starts_at_modal').val(), employee_id: this.$('#employeeSelect').val(), customer_id: this.$('#customerSelect').val(),
                        "starts_at(5i)": this.$('#appointment_starts_at_5i_modal').val() , 
                        "ends_at(5i)":  this.$('#appointment_ends_at_5i_modal').val(), task_ids: tasks}, {
            success: function(model, resp) {
                self.model = model;   

                self.close();
            },
            error: function() {
                //new App.Views.Error();
            }
        });
        return false;
    },
4

1 に答える 1

1

エラーから、それはルビーの問題のように聞こえます、そして私はルビーに全く精通していません。ただし、バックボーンに関しては、予定モデルに「tasks」属性と「task_ids」属性があることは問題ではありません。バックボーンはそれらをJSONデータとしてサーバーに送信します。ただし、Backboneでネストされたコレクションを操作する場合、タスクモデルの外部で属性としてIDを渡す方法は少し奇妙であることに注意してください。:-)

ただし、バックボーンの観点から見たものについて少し話すことができます。

私はあなたのtasks_ids属性があなたが持っているすべてのタスクのIDの配列を表すと仮定しています。tasksタスクJSONオブジェクトのarray()です。バックボーンでは、ネストされたコレクションなどを操作する場合、通常、id各タスクの属性はタスクオブジェクトの一部になります。したがって、一連のタスクデータを配列として送信するアプリを作成した場合、次のように送信されます。

"tasks"=>
     "[{\"id"=>\"12\", \"created_at\"=>\"2012-09-04T13:37:17+02:00\",
       \"duration\"=>\"60\", \"id\"=>\"12\",
       \"task_category_id\"=>\"5\", \"updated_at\"=>\"2012-09-04T13:46:13+02:00\"}]",

ネストされたコレクションを操作するときは、基本的に、一部のモデルのIDとすべての属性がオブジェクトによってカプセル化されていることを確認します。

// My fake JSON
{'id':'1', 'appointment':{
    'id':'50',
    'tasks':[
        {'id':'100', 'taskName':'groceries' /* etc. */},
        {'id':'200', 'taskName':'bank errand'}
    ]
}}

アポイントメントモデルがこのフェッチされたデータを受信したら、それを自分のメソッドparse()または変更されたメソッドで処理しますset()。私が何をしているのかをデモンストレーションしますparse()

// Inside my appointment model definition
parse: function(response) {
    if (_.isUndefined(this.tasks)) {
        this.tasks = new TasksCollection();
    }
    this.tasks.reset(response.tasks);
    delete response.tasks;

    return response;
}

上記のようなもの。TasksCollectionがmodel: Task定義されているので、属性ハッシュを使用してリセットすると、予定モデル内にネストされたコレクションに適切なデータ(IDが含まれています)が入力されます。

これで問題が解決するとは思いませんが、バックボーンのやり方をほのめかしていたので、この方法(多くの中で)を説明しておくと、いくつかのアイデアが得られると思いました。

于 2012-09-05T07:21:42.277 に答える