在创建时嵌入嵌套资源FK值

时间:2012-11-11 16:29:04

标签: ruby-on-rails ember.js ember-data

我是一名余烬的新手,从昨天开始我就一直在摸不着头脑。 我想使用带有序列化程序的ember和rails制作一个简单的Blog示例。

我已经能够为帖子制作CRUD,没问题。大多数代码都在路由器中。

我的评论有问题,声明如下:

App.Comment = DS.Model.extend
   body: DS.attr('string')
   post: DS.belongsTo('App.Post')  

App.Post = DS.Model.extend
    title: DS.attr('string')
    body: DS.attr('string')
    comments: DS.hasMany('App.Comment',embedded: true)    

显示帖子的评论是好的,路线如下:/#/ posts /:id / comments。

新评论链接位于评论列表的底部,因此创建新评论的路线为:

/#/帖/:ID /评论/新

那时我遇到了问题:我怎么告诉ember-data哪个帖子拥有该评论?我的意思是,做这件事的最佳做法是什么?

最后我决定在显示表单之前初始化comment.post_id,在路由器中编码。它看起来像:

create: Em.Route.extend
   route: '/new'
   connectOutlets: (router, context) ->
      transaction = router.get('store').transaction()
      comment = transaction.createRecord(App.Comment)
      comment.set('post_id', router.get('postController').get('id'))
      router.get('applicationController').set('transaction', transaction)
      router.get('commentsController').connectOutlet
          viewClass: App.EditCommentView
          controller: router.get('commentController')
          context: comment
   save: (router, event) ->
       router.get('applicationController.transaction').commit()
       router.transitionTo('index')

但它不起作用,回到服务器,post请求没有post_id的值。

我尝试在表单中为post_id添加一个输入字段,以便在保存之前检查该值,并且值是正确的。

我尝试调试路由器中的save函数,该函数在提交表单时触发。这里post_id值也是正确的。

我一定错过了什么,但我不知道是什么......

菲利普

1 个答案:

答案 0 :(得分:1)

您应该在评论中设置帖子,但不能通过post_id属性设置。

是的,post_id是您的服务器和Ember数据将序列化关联的外键的方式,但这是Ember Data希望从您那里抽象出来的细节。在与模型交互时,您不应该知道或关心如何通过Ember Data序列化关联数据(或任何数据)并将其传递给服务器。 (事实上​​,与Rails不同,post_id实际上永远不会作为Comment记录中的属性存在。)

相反,您应该只是与模型中定义的属性和关联进行交互。如果您的Comment模型具有post belongsTo关联,则只需使用comment.set('post', post)即可。这意味着在Rails中表现得像comment.post = post,为您处理所有细节。