2

これは少しトリッキーな質問だと思います。問題は、JSON 応答を介して、Ruby on Rails バックエンドと Ember/Ember-Data の間で複雑な関係を持つ 2 つのモデルを (テーブル間の結合などを使用して) 正常に接続したことです。

問題は、3 番目のモデルを接続できないことです。その ID は、正常に動作する別のモデルに埋め込まれています。問題は、実際にデータを使用して有効な JSON 応答を取得していることですが、ember コントローラーで何らかの理由で ember-data モデルがそれらを取得していないことです。

これは私が取得しようとしているモデルです:

Profile.js

App.Adapter.map
(
  'App.Profile',
  {
    projects: {embedded: 'load'},
    people: {embedded: 'load'}
  }
);

App.Profile = DS.Model.extend
(
   {
      name: DS.attr('string'),
      tools: DS.attr('string'),
      number: DS.attr('number'),
      projects: DS.hasMany('App.Project', {embedded: 'load'}),
      people: DS.hasMany('App.Person', {embedded: 'load'})
   }
);

JSON 応答が有効なモデルPerson.jsが返されました。

App.Adapter.map
(
  'App.Person',
  {
    profiles: {embedded: 'load'},
    projectsCreated: {embedded: 'load'},
    projects: {embedded: 'load'},
    friends: {embedded: 'load'}
  }
);

App.Person = DS.Model.extend
(
   {
      name: DS.attr('string'),
      place: DS.attr('string'),
      email: DS.attr('string'),
      password: DS.attr('string'),
      academic: DS.attr('string'),
      professional: DS.attr('string'),
      profiles: DS.hasMany('App.Profile', {embedded: 'load'}),
      knowledge: DS.attr('string'),
      projectsCreated: DS.hasMany('App.Project', {embedded: 'load'}),
      projects: DS.hasMany('App.Project', {embedded: 'load'}),
      friends: DS.hasMany('App.Person', {embedded: 'load'}),
      iconUrl: DS.attr('string')
   }
);

それぞれに使用されるシリアライザーprofile_serializer.rbとperson_serializer.rb :

class ProfileSerializer < ActiveModel::Serializer
  attributes :id,
             :name,
             :tools,
             :number

  has_many :projects, ember: :id
  has_many :people, ember: :id           
end

class PersonSerializer < ActiveModel::Serializer
  attributes :id,
             :name,
             :place,
             :email,
             :password,
             :academic,
             :professional,
             :knowledge,
             :icon_url

  has_many :friends, embed: :id
  has_many :projects_created, embed: :id
  has_many :projects, embed: :id
  has_many :profiles, embed: :id
end       

そして最後に、JSON 応答:

GET http://localhost:3000/people 

{
    "people": [
        {
            "id": 1,
            "name": "Daniel",
            "place": "Ireland",
            "email": "daniel@example.com",
            "password": "123456",
            "academic": "Computing Engineer",
            "professional": "Fundecor",
            "knowledge": "html, css, javascript, jquery, ember",
            "icon_url": "http://imageshack.us/a/img196/6619/xckl.jpg",
            "friend_ids": [
                2,
                3
            ],
            "projects_created_ids": [
                1
            ],
            "project_ids": [],
            "profile_ids": [
                1,
                3,
                5
            ]
        },
        {
            "id": 2,
            ...
        },
        {
            "id": 3,
            ...
        }
    ]
}

そして次のステップはこれに対するクエリでprofile_ids、正しい答えは次のとおりです。

GET http://localhost:3000/profiles?ids%5B%5D=1&ids%5B%5D=3&ids%5B%5D=5

{
    "profiles": [
        {
            "id": 1,
            "name": "Frontend",
            "tools": "html, css, javascript, jquery",
            "number": 0,
            "projects": [],
            "people": [
                {
                    "id": 1,
                    "name": "Daniel",
                    "place": "Ireland",
                    "email": "daniel@example.com",
                    "password": "123456",
                    "academic": "Computing Engineer",
                    "professional": "Fundecor",
                    "knowledge": "html, css, javascript, jquery, ember",
                    "icon_url": "http://imageshack.us/a/img196/6619/xckl.jpg",
                    "friend_ids": [
                        2,
                        3
                    ],
                    "projects_created_ids": [
                        1
                    ],
                    "project_ids": [],
                    "profile_ids": [
                        1,
                        3,
                        5
                    ]
                }
            ]
        },
        {
            "id": 2,
            "name": "Mobile Developer",
            ...
        },
        ...
    ]
}

すべてのプロファイル エントリが返されます。しかし、問題は、コントローラーまたはルートを介してこれを取得しようとすると、ブラウザーコンソール (firebug など) に表示される結果が空になることです。person のすべてのフィールドは、 を含めて正しく埋められますが、モデル自体は埋められprofile_idsません。profile

コード全体を入手したい場合は、https://github.com/neil89/project-onで確認できます。ご回答ありがとうございます。

4

0 に答える 0