Backbone使用id更新嵌套集合。 (Rails后端)

时间:2012-09-04 15:37:30

标签: ruby-on-rails ruby-on-rails-3 backbone.js backbone-relational

我有一个模型预约,有很多任务。

创建一个新的约会模型,其任务与骨干一起工作正常。但是当我尝试使用不同任务的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"}

我有点认为问题是请求中有task和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;
    },

1 个答案:

答案 0 :(得分:1)

从错误中,它听起来像红宝石问题,我根本不熟悉红宝石。但是,对于Backbone,在预约模型中有“tasks”和“task_ids”属性应该不是问题。 Backbone很乐意将这些作为JSON数据发送到您的服务器。但请注意,在Backbone中使用嵌套集合时,将id作为属性传递给任务模型之外的方式有点奇怪。 : - )

我可以谈谈我从Backbone的角度看到的内容。

我假设您的tasks_ids属性代表您拥有的所有任务的ID数组。 tasks是任务JSON对象的数组()。在Backbone中,当使用嵌套集合等时,通常每个任务的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。)

我不认为这可以解决你的问题,但是既然你暗示了Backbone的做事方式,我认为这种方式(在众多中)可能会给你一些想法。