我有一个文件和标签模型,它们是多对多的关系:
App.File = DS.Model.extend
name: DS.attr('string')
tags: DS.hasMany('tag')
App.Tag = DS.Model.extend
name: DS.attr('string')
files: DS.hasMany('file')
我正在通过Rails后端生成JSON读取数据,到目前为止一切正常。我正在尝试在我的Ember路径中编写一个tagFile
函数,用于标记具有特定标记的文件。这在ember端工作正常,但当然它不会持久,我无法弄清楚如何将正确的HTTP请求发送到Rails后端。所以我有
App.FilesRoute = Ember.Route.extend
...
actions:
tagFile: (file, tag) ->
file.get('tags').pushObject(tag)
tag.get('files').pushObject(file)
# file.save() ? or something similar?
我尝试了file.save()
,它发送了一个PUT请求,但Rails中发送的params
哈希根本不包含Tag
记录。我在ember-data内的updateRecord()
方法中设置了断点,并在通过AJAX发送之前检查了data
变量,此变量也不包括Tag
记录。
发送HTTP请求(PUT或其他)的正确方法是什么,我可以将我的子记录传递到params
哈希?有没有办法使用ember-data方法传递任意数据?我可以编写自己的AJAX调用,但似乎我没有利用余烬数据。任何见解?
使用:Ruby 2 / Rails 4后端,Ember 1.3.0-beta.1 + canary.48513b24,Ember-data 1.0.0-beta.4 + canary.c15b8f80
答案 0 :(得分:1)
file.get('tags').pushObject(tag);
tag.save();
file.save();
Dual hasMany会将它们连接在一起http://emberjs.jsbin.com/OxIDiVU/94/edit
如果要为其中一种类型创建自定义序列化程序以包含另一种类型。这是来自ED的略微修改的
App.FileSerializer = DS.RESTSerializer.extend({
serialize: function(record, options) {
var json = {};
if (options && options.includeId) {
var id = get(record, 'id');
if (id) {
json[get(this, 'primaryKey')] = get(record, 'id');
}
}
record.eachAttribute(function(key, attribute) {
this.serializeAttribute(record, json, key, attribute);
}, this);
var tags = [];
record.eachRelationship(function(key, relationship) {
if (relationship.kind === 'belongsTo') {
this.serializeBelongsTo(record, json, relationship);
} else if (relationship.kind === 'hasMany') {
record.get(relationship.key).forEach(function(tag){
tags.push(tag.toJSON());
});
//this.serializeHasMany(record, json, relationship);
}
}, this);
json.tags = tags;
return json;
}
});
http://emberjs.jsbin.com/OxIDiVU/95/edit
或更具体的序列化程序
App.FileSerializer = DS.RESTSerializer.extend({
serialize: function(record, options) {
var json = {},
tags=[];
json.id = record.get('id');
json.name = record.get('name');
record.get('tags').forEach(function(tag){
var tagJson = {};
tagJson.id = tag.get('id');
tagJson.name = tag.get('name');
tags.push(tagJson);
});
json.tags = tags;
return json;
}
});