Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails API中的关联不能与Ember应用程序兼容地序列化_Ruby On Rails_Ruby_Ember.js_Ember Cli - Fatal编程技术网

Ruby on rails Rails API中的关联不能与Ember应用程序兼容地序列化

Ruby on rails Rails API中的关联不能与Ember应用程序兼容地序列化,ruby-on-rails,ruby,ember.js,ember-cli,Ruby On Rails,Ruby,Ember.js,Ember Cli,我创建了一个Rails API(使用Rails API gem)供我的Ember应用程序使用(使用Ember cli) 我的问题是,我在API中设置的关联似乎并不能完全满足我的Ember应用程序的需求,我也不知道需要更改什么或以不同的方式完成什么 下面,描述了我目前所在的位置以及我采取的步骤 我生成了两个脚手架: rails g scaffold movement name:string movement_type:string rails g scaffold record max_effo

我创建了一个Rails API(使用Rails API gem)供我的Ember应用程序使用(使用Ember cli)

我的问题是,我在API中设置的关联似乎并不能完全满足我的Ember应用程序的需求,我也不知道需要更改什么或以不同的方式完成什么

下面,描述了我目前所在的位置以及我采取的步骤

  • 我生成了两个脚手架:

    rails g scaffold movement name:string movement_type:string
    
    rails g scaffold record max_effort:integer max_type:string movement:references
    
    产生了:

    模型

    class Movement < ActiveRecord::Base
    end
    
    class Record < ActiveRecord::Base
      belongs_to :movement
    end
    
  • 我创建了种子数据(使用faker gem)并运行
    bundle exec rake db:seed

    种子(rails/app/db/Seeds.rb)

    当我运行rails时,相应的URL显示:

  • 我为AMS兼容性设置了Ember适配器、序列化程序和路由器

    适配器

    export default DS.ActiveModelAdapter.extend({
    });
    
    序列化程序

    export default DS.ActiveModelSerializer.extend({
    });
    
    路由器

    var Router = Ember.Router.extend({
      location: 'auto'
    });
    
    export default Router.map(function() {
      this.resource('movements', function() {
        this.resource('movement', {path: ':id'}, function() {
          this.route('records');
        });
      });
    });
    
  • 我为我的余烬模型设置了与Rails中相同的关联

    运动

    export default DS.Model.extend({
      name:         DS.attr('string'),
      movementType: DS.attr('string'),
      records:      DS.hasMany('record')
    });
    
    记录

    export default DS.Model.extend({
      maxEffort: DS.attr('number'),
      maxType: DS.attr('string'),
      movement: DS.belongsTo('movement')
    });
    
  • 我设置了各自的余烬路线

    移动(app/routes/Movement.js)

    记录(app/routes/movement/Records.js)

  • 我运行
    ember s--proxyhttp://localhost:3000

    结果:

    所有移动都会在应用程序的UI中按预期进行填充和行为。但是,它们的关联记录并非如此。灰烬检查器显示未加载任何记录

  • 结束语:

    在我看来,rails返回的JSON应该显示一些对记录的引用。我尝试将显式关联添加到移动模型和序列化程序:

        class Movement < ActiveRecord::Base
          has_many :records  
        end
    
        class MovementSerializer < ActiveModel::Serializer
          attributes :id, :name, :movement_type
          has_many :records
        end
    
    类移动
    这只是在我尝试运行Rails服务器时产生了一个错误

    我的另一个预感是seeds.rb代码是问题所在。这是我第一次使用Faker,但我仍然不是Ruby方面的专家

    我被卡住了,我确信这是因为我缺乏使用Ruby/Rails和Ember中的一个或两个的经验。 我希望我在这里所说的一切,对于更有经验的人来说,这将是一个容易发现的错误


    谢谢。

    根据ember json约定,您的记录json应该是这样的

    如果绝对必要的话,深度嵌套是有点困难的,因为在同一个模板中使用它们自己的插座。如果没有,就单独走一条路


    另外,如果您正在努力进行深度嵌套,您可以创建自己的自定义rest适配器,指向url。

    回答这个问题可能会晚一些,但如果您可以在
    Rails
    侧添加
    embed:id,embed\u in\u root:true
    MovementSerializer
    类,这可能会有所帮助。我几乎遇到了同样的问题,但没有补充

    export default DS.ActiveModelAdapter.extend({
    });
    
    export default DS.ActiveModelSerializer.extend({
    });
    
    var Router = Ember.Router.extend({
      location: 'auto'
    });
    
    export default Router.map(function() {
      this.resource('movements', function() {
        this.resource('movement', {path: ':id'}, function() {
          this.route('records');
        });
      });
    });
    
    export default DS.Model.extend({
      name:         DS.attr('string'),
      movementType: DS.attr('string'),
      records:      DS.hasMany('record')
    });
    
    export default DS.Model.extend({
      maxEffort: DS.attr('number'),
      maxType: DS.attr('string'),
      movement: DS.belongsTo('movement')
    });
    
    export default Ember.Route.extend({
      model: function(params) {
        return this.store.find('movement', params.id);
      }
    });
    
    export default Ember.Route.extend({
      model: function() {
        return this.modelFor('movement').get('records');
      }
    });
    
        class Movement < ActiveRecord::Base
          has_many :records  
        end
    
        class MovementSerializer < ActiveModel::Serializer
          attributes :id, :name, :movement_type
          has_many :records
        end
    
    {
      records: [
      {
        id: 1,
        max_effort: 90,
        max_type: "rep",
        movement_id: 3
      }],
      movements: [
      {
        id: 7,
        name: "quia",
        movement_type: "pushing"
      }
      {
        id: 3,
        name: "quia",
        movement_type: "pushing"
       }
     ],
    }