これは少しトリッキーな質問だと思います。問題は、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で確認できます。ご回答ありがとうございます。