在 Ember 中保存相关记录
Save associated record in Ember
我是 Ember 的初学者,正在尝试实现一个简单的 post 和评论应用程序。
我有 rails 背景,因此我为此使用 Rails API。
我已经按照教程进行操作,并且能够保存 post,获取其所有评论并删除 post。但是我在保存与 post.
相关的评论时遇到问题
模型代码如下
post.js
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
comments: DS.hasMany('comment')
});
comment.js
import DS from 'ember-data';
export default DS.Model.extend({
author: DS.attr('string'),
body: DS.attr('string'),
post: DS.belongsTo('post')
});
routes/post/comment/new.js
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return {};
},
renderTemplate() {
this.render('post.comment.new', { into: 'application' });
},
actions: {
save() {
const post = this.modelFor('post');
const newComment = this.get('store').createRecord('comment', this.currentModel);
newComment.set('post', post);
newComment.save().then(() => {
this.transitionTo('post', post);
});
},
cancel() {
this.transitionTo('post', this.modelFor('post'));
}
}
});
router.js
import Ember from 'ember';
import config from './config/environment';
const Router = Ember.Router.extend({
location: config.locationType,
rootURL: config.rootURL
});
Router.map(function() {
this.route('posts');
this.route('post.new', { path: 'posts/new' });
this.resource('post', { path: 'posts/:post_id' }, function() {
this.route('comment.new', { path: 'comments/new' });
});
});
export default Router;
保存评论是我遇到的问题。这真的很奇怪但是在保存评论时,传递给服务器的参数看起来像
Parameters: {"comment"=>{"author"=>"dsa", "body"=>"asd", "post"=>"9"}}
Unpermitted parameter: post
据我了解,参数应该是 post_id 而不是 post。如果 post 被传递,那么它应该是对象。当然我可能是错的,因为我对Ember还没有很清楚的理解。
在随机摆弄代码时,我发现如果我从
替换评论模型中的关系
post: DS.belongsTo('post')
到
post_id: DS.belongsTo('post')
传递给服务器的参数是
Parameters: {"comment"=>{"author"=>"fg", "body"=>"dfs", "post_id"=>nil}}
然而,这实际上并没有将 post_id 作为 nil 传递。
这可能是绝对错误的,而不是它应该如何工作,但我一无所知。
感谢您的帮助。
创建评论序列化程序并重写 keyForRelationship
方法,如下所示:
keyForRelationship(key/*, relationship, method*/) {
if(key === 'post') return 'post_id';
return this._super(...arguments);
}
和 post 关系应该是:
post: DS.belongsTo('post')
我是 Ember 的初学者,正在尝试实现一个简单的 post 和评论应用程序。
我有 rails 背景,因此我为此使用 Rails API。
我已经按照教程进行操作,并且能够保存 post,获取其所有评论并删除 post。但是我在保存与 post.
相关的评论时遇到问题模型代码如下
post.js
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
comments: DS.hasMany('comment')
});
comment.js
import DS from 'ember-data';
export default DS.Model.extend({
author: DS.attr('string'),
body: DS.attr('string'),
post: DS.belongsTo('post')
});
routes/post/comment/new.js
import Ember from 'ember';
export default Ember.Route.extend({
model() {
return {};
},
renderTemplate() {
this.render('post.comment.new', { into: 'application' });
},
actions: {
save() {
const post = this.modelFor('post');
const newComment = this.get('store').createRecord('comment', this.currentModel);
newComment.set('post', post);
newComment.save().then(() => {
this.transitionTo('post', post);
});
},
cancel() {
this.transitionTo('post', this.modelFor('post'));
}
}
});
router.js
import Ember from 'ember';
import config from './config/environment';
const Router = Ember.Router.extend({
location: config.locationType,
rootURL: config.rootURL
});
Router.map(function() {
this.route('posts');
this.route('post.new', { path: 'posts/new' });
this.resource('post', { path: 'posts/:post_id' }, function() {
this.route('comment.new', { path: 'comments/new' });
});
});
export default Router;
保存评论是我遇到的问题。这真的很奇怪但是在保存评论时,传递给服务器的参数看起来像
Parameters: {"comment"=>{"author"=>"dsa", "body"=>"asd", "post"=>"9"}}
Unpermitted parameter: post
据我了解,参数应该是 post_id 而不是 post。如果 post 被传递,那么它应该是对象。当然我可能是错的,因为我对Ember还没有很清楚的理解。
在随机摆弄代码时,我发现如果我从
替换评论模型中的关系post: DS.belongsTo('post')
到
post_id: DS.belongsTo('post')
传递给服务器的参数是
Parameters: {"comment"=>{"author"=>"fg", "body"=>"dfs", "post_id"=>nil}}
然而,这实际上并没有将 post_id 作为 nil 传递。
这可能是绝对错误的,而不是它应该如何工作,但我一无所知。
感谢您的帮助。
创建评论序列化程序并重写 keyForRelationship
方法,如下所示:
keyForRelationship(key/*, relationship, method*/) {
if(key === 'post') return 'post_id';
return this._super(...arguments);
}
和 post 关系应该是:
post: DS.belongsTo('post')