1

私はエンバーの初心者で、昨日から頭を悩ませています。シリアライザーで ember と rails を使用して、簡単なブログの例を作成したいと思います。

投稿の 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 のようになります。

新しいコメントのリンクはコメント リストの一番下にあるため、新しいコメントを作成する方法は次のとおりです。

/#/posts/:id/comments/new

その時点で私は問題にぶつかりました:どの投稿がそのコメントを所有しているかを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 の入力フィールドを追加して、保存する前に値を確認しようとしましたが、値はそこにあり、正しいです。

フォームが送信されたときに起動されるルーターの保存機能をデバッグしようとしました。ここでも post_id の値は正しいです。

私は何かが欠けているに違いないのですが、何がわからないのですか.....

フィリップ

4

1 に答える 1

1

プロパティ経由ではなく、コメントに投稿を設定する必要がありpost_idます。

はい、post_idサーバーと Ember Data の両方が関連付けの外部キーをシリアル化する方法ですが、それは Ember Data が抽象化したい詳細です。モデルを操作するときは、アソシエーション データ (または実際には任意のデータ) が Ember Data によってどのようにシリアル化され、サーバーに渡されるかについて知ったり気にしたりする必要はありません。(実際、Rails とは異なり、レコードpost_idのプロパティとして実際に存在することはありません。)Comment

代わりに、モデルで定義されている属性と関連付けを単純に操作する必要があります。関連付けのあるCommentモデルがある場合は、を使用してください。これは、Rails のように動作することを意図しており、すべての詳細を処理します。postcomment.set('post', post)comment.post = post

于 2012-11-17T16:27:02.173 に答える