Como adicionar um registro filho ao registro pai existente?
Eu estive pesquisando e vasculhando o Stack Overflow para algum tipo de dica sobre este assunto, mas a informação está espalhada na melhor das hipóteses.
Estou tentando criar um novo registro filho (Comment
) e salve-o em um registro pai existente (Post
). Eu estou usando o Ember-Model, em vez de Ember-Data, mas quaisquer dicas ou ponteiros seriam muito apreciados.
No momento, tenho tido sucesso em criar um novo e incorporadoComment
massó quando é criado com umNovo Post
registro. Assim:
Como faço para carregar / recuperar a carga atualmente carregada?Post
(registro pai) para aplicarComments
(registros filho) para isso?
Eu tenho lido sobre as dependências do controlador, usandoneeds:
ethis.controllerFor
ethis.modelFor
para ter acesso a outro controlador / modelocontent
mas não conseguimos conectar essas coisas em algo significativo.
De qualquer forma, aqui está o que eu reduzi meu código de aplicação, na esperança de que eu possa ser capaz de tropeçar na maneira correta de fazer isso ...
Rotas App.Router.map(function() {
this.resource('post', { path: '/:post_id' }, function() {
this.resource('comments', { path: '/comments'} );
});
});
Eu removi todos os outros recursos e rotas, então eu fiquei comApp.Post
, App.PostIndex
eApp.Comments
. Acho que minhas rotas são o problema aqui, suponho que não estou implementando corretamente os métodos para usar oPost
gravar na minhaComments
rota.
App.IndexRoute = Ember.Route.extend({
model: function() {
return App.Post.find();
},
setupController: function(controller, model) { // I'm not certain if this
controller.set('content', model); // setupController is needed?
}
});
App.PostRoute = Ember.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
setupcontroller: function( controller, model) { // again, unsure if this
this.controllerFor('post').get('comments'); // is correct.
controller.set('content', comments);
}
});
App.CommentsRoute = Ember.Route.extend({
afterModel: function() {
this.set('post', this.modelFor('post'));
},
setupcontroller: function( controller, model) {
this.controllerFor('post').get('comments');
controller.set('content', comments);
}
});
ControladorApp.CommentsController = Ember.ArrayController.extend({
needs: "post",
actions: {
addComment: function() {
var post = App.Post.create({
title: 'static post title'
});
post.get('comments').create({
message: 'static message'
});
post.save();
}
}
});
Este é o meu atual Controlador de Comentários, que pode criar um novoPost
com um incorporadoComment
. Eu encontrei e foi dado numerosos exemplos em que para criar oComment
, mas nenhum parece funcionar para mim. Basicamente, estou lutando para definir ovar post = ...
como o registro atualmente carregado. Eu implementei várias abordagens em uma tentativa de tentativa e erro. Até agora eu tentei:
var post = App.Post.create();
, retorna a propriedade indefinida, pois isso criaria um novo registro. No entanto, eu dei uma chance, como todos os exemplos que vi relacionados a isso definiram seu registro como tal.
var post = this.get('post');
, retorna um não pode chamar "get" em indefinido. Eu tentei usar este método de definir o meu post atual em ambos osComments
controlador ePost
controlador.
var post = this.get('controllers.post.content);
, retorna um 'erro cíclico' do backend que estou usando.
var post = App.Post.find();
, retorna um não pode chamar "get" em indefinido.
var post = App.Post.find(1);
Novamente, retorna um não pode chamar 'get' em undefined. Pensei em dar uma chance porque esse é um daqueles exemplos recorrentes que as pessoas fornecem. O backend que eu uso aplica seu próprio ID a cada registro, e não tenho certeza se conseguiria / como ter o.find()
use um valor de ID dinâmico e recupere somente o modelo que acabei de carregar.
Eu estou supondo que não estou configurando adequadamente minhas dependências de Rotas e Controladores?
Se alguém tiver uma sugestão, link relevante ou correção, ficaria muito grato.
Este (aparentemente simples) problema / caso de uso me tem no final da inteligência neste momento.