Ember Rails' POST'嵌套路线

时间:2015-07-11 15:37:57

标签: ruby-on-rails ember.js ember-data rails-api

当保存嵌套资源时(保存属于属性的高亮显示),Ember似乎不会在嵌套路由层次结构上拾取并且' POSTS'只是' api / v1 / highlight'当我需要它来发布' POST'到' api / v1 / properties / property_id / highlight'。所以我考虑在后端取消嵌套路由以解决它并以某种方式传递property_id,但是能够让它理解正确的路由会容易得多。我遇到了buildURL mixin来为每次构建正确的路径,并且想知道这是否是最好的方法,并且我做错了什么?

感谢您提前获得所有帮助

以下是我的代码的一部分......

的routes.rb

namespace :api, defaults: { format: :json } do
namespace :v1 do
  resources :users, only: [:show, :update] 
  resources :user_devices, only: [:show]
  resources :properties do

    resources :highlights do
      resources :options
    end
  end 
  resources :fields
end

router.js

this.route('properties', function() {
this.route('new');

this.route('property', {path: ':property_id'}, function() {
  this.route('edit');
  this.route('details');

  this.route('highlights', function() {
    this.route('new');

    this.route('highlight', {path: ':highlight_id'}, function() {
      this.route('edit');

      this.route('options', function() {
        this.route('new');

        this.route('option', {path: ':option_id'}, function() {
          this.route('edit');
        });
      });
    });
  });

适配器

import Ember from 'ember';

export default Ember.Mixin.create({
  host: 'http://localhost:3000',
  namespace: 'api/v1'
});

在highlight.js中突出显示模型

property: DS.belongsTo('property', {async: true }),

property.js中的属性模型

highlights: DS.hasMany('highlight', {async: true }),

1 个答案:

答案 0 :(得分:0)

使用ember-data时的一般惯例是每个模型端点都是彼此的兄弟。

如果你真的想要这样做,你将不得不构建自己的适配器,这比按照惯例做更多的努力。

所以您的routes.rb看起来像

namespace :api, defaults: { format: :json } do
  namespace :v1 do
    resources :users, only: [:show, :update] 
    resources :user_devices, only: [:show]
    resources :properties
    resources :highlights
    resources :options
  end 
  resources :fields
end

模型/ highlights.js

export default Model.extend({
  property: DS.belongsTo('property', {async: true })
})

模型/ property.js

export default Model.extend({
  property: DS.hasMany('highlight', {async: true })
})

模型/ options.js

export default Model.extend({
  property: DS.belongsTo('highlight', {async: true })
})

属性控制器中的操作,例如

save:function(){
   highlight.save().then(function(highlight){
     property.get(highlights).pushObject(highlight);
     property.save();
   });
}

当property.save执行时,您的适配器会自动将highlight_ids :[1]添加到它发送给服务器的有效负载