余伯有很多和复数

时间:2014-03-30 16:10:32

标签: ember.js

Lost.Router.map(function() {
  this.resource('countries',{path: '/'}, function(){
     this.resource('country',{path: ':country_id'},function(){
      this.resource('city',{path: ':city_id'});
    });
  });
});

我的国家/地区型号

  Lost.Country = DS.Model.extend({
      countryCode: DS.attr('string'),
      countryName: DS.attr('string'),
      places: DS.hasMany('place')
    });

我的地方模型是

Lost.Place = DS.Model.extend({
  cityName: DS.attr('string'),  
  country: DS.belongsTo('country')
});

在国家模型中,当我更改地点以使此工作正常 但当我把它作为地方我得到错误

TypeError: Cannot set property 'store' of undefined

DEBUG: Ember      : 1.6.0-beta.1+canary.3bcd9bdc 
DEBUG: Ember Data : 1.0.0-beta.7+canary.d5562867 
DEBUG: Handlebars : 1.3.0 
DEBUG: jQuery     : 1.11.0 

已更新

从rails服务器返回的对象

Acual JSON:

{
   "countries":[
      {
         "id":1,
         "countryCode":"BH",
         "countryName":"Bhutan",
         "places":[
            {
               "id":1,
               "country_id":1,
               "cityName":"Daga"
            },
            {
               "id":2,
               "country_id":1,
               "cityName":"Ha"
            }
         ]
      }
   ]
}

以下是我的rails序列化程序的外观

application_serializer.rb

class ApplicationSerializer < ActiveModel::Serializer
  embed :ids, :include => true
end

country_serializer.rb

class CountrySerializer < ActiveModel::Serializer
  attributes :id, :countryCode, :countryName
  has_many :places
end

place_serializer

class PlaceSerializer < ActiveModel::Serializer
  attributes :id, :country_id, :cityName
  #belongs_to :country #commented out because gives error"undefine method belongs_to"
                       #if i change it to has_one gives error"stack level too deep"
end

* * Additon to anwer * * 这个问题已由@ kingpin2k回答 作为答案的一部分,如果你是像我这样的新开发人员,而不是编写自己的normalizeAttribute函数,我认为在ember-data中存在的DS.RESTAdapter中使用已经存在的normalizeAtrribute函数会更好。不容易出错。 只是复制粘贴它为我工作

  

Ember数据:1.0.0-beta.6

1 个答案:

答案 0 :(得分:1)

Lost.Place = DS.Model.extend({
  cityName: DS.attr('string'),  
  country: DS.belongsTo('Country')
});

应该是(小写国家)

Lost.Place = DS.Model.extend({
  cityName: DS.attr('string'),  
  country: DS.belongsTo('country')
});

我无法从你的问题中说出来,但json应该是一个地方的id数组。

如果您正在使用ActiveModelSerializer,那么您可以将嵌入设置为始终,这是您尝试返回的方式。您的数据会导致一些小问题,因为它会将countryCode视为country_code,但您可以覆盖某些功能来修复此验证,或者您可以修复您的json以匹配预期数据

App.ApplicationAdapter= DS.ActiveModelAdapter;

App.ApplicationSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    places: {embedded: 'always'}
  },
  normalizeAttributes: function(type, hash) {
   //your attributes shouldn't be normalized
  }
});

Lost.Country = DS.Model.extend({
  countryCode: DS.attr('string'),
  countryName: DS.attr('string'),
  places: DS.hasMany('place')
});

http://emberjs.jsbin.com/OxIDiVU/342/edit