我有一个模特约会,有很多任务。
创建一个包含任务的新约会模型可以很好地使用主干网。但是当我尝试用不同任务的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_id,但我不知道如何在主干中解决这个问题。
我的更新方法如下:
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;
},
从这个错误来看,这听起来像是一个ruby问题,我对ruby一点也不熟悉。但是,对于Backbone,您的约会模型中有"tasks"one_answers"task_ids"属性应该不是问题。Backbone会很乐意将这些数据作为JSON数据发送到您的服务器。但是,请注意,当在Backbone中处理嵌套集合时,将id作为属性传递到任务模型之外的方式有点奇怪。:-)
不过,我可以从骨干的角度谈一谈我所看到的。
我假设您的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)填充嵌套在我的约会模型中的集合
我不认为这能解决你的问题,但由于你暗指的是骨干的做事方式,我认为用这种方式(在许多例子中)可能会给你一些想法。