带有Rails的Ember.js accepted_nested_attributes_for和polymorphic has_many/belongs_to

yuя*_*uяi 4 api json ember.js ruby-on-rails-4

在Rails API方面,我有以下两个模型:

class Grower < ActiveRecord::Base
 has_many :addresses, as: :addressable
 accepts_nested_attributes_for :addresses
end

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)

以及一个Growers控制器,它返回并可以创建/更新具有嵌入式地址属性的种植者.我还有一个具有正确路由的地址控制器,以便可以查看/创建/更新特定种植者的地址.后者更像是"in-case",我不确定我是否需要返回/更新/创建地址作为单独的有效负载.

我开始尝试拼凑一个Ember应用程序,这个应用程序允许我在地址的同时查看/编辑/创建一个Grower.任何人都可以指向现有的真实或示例应用程序吗?我将在发布时发布我的代码,但我已经知道某些方面我会遇到麻烦:

  1. Rails返回/期望名为addresses_attributes的嵌套参数.我确信,恩伯不会使用那种惯例.解决这个问题的最佳方法是什么?

  2. 由于多态关联(Grower以外的对象可以寻址),在API /地址方面,为了获得正确的belongs_to对象,Rails将addressable_idaddressable_type结合使用.在此示例中,addressable_type将是"Grower",而addressable_id将是grower_id值.怎么会在Ember那边翻译呢?

更新:

我让它至少以不同的方式工作.至少对于这种特殊情况,我的首选解决方案是在答案部分.

小智 8

以下是基于@yuяi的策略的代码示例,该策略对我有用:

App.Post = DS.Model.extend
    comments: DS.hasMany('comment')

App.PostSerializer = DS.ActiveModelSerializer.extend( DS.EmbeddedRecordsMixin,
    attrs:
        comments: {embedded: 'always'}

    keyForAttribute: (attr) ->
        if attr == "comments"
            "comments_attributes"
        else
            @_super(attr)
)
Run Code Online (Sandbox Code Playgroud)

该解决方案适用于Ember 1.6.1和Ember Data 1.0.0-beta.8.2a68c63a.


yuя*_*uяi 6

我找到了几种方法来完成它,但最终方法不需要对Rails/API方面进行任何更改.

在客户端(Ember)方面:

  1. 我将地址 hasMany属性添加到App.Grower模型中.我还通过将地址设置为addresses_attributes,它映射到RESTAdapter上,以达到API的预期.
  2. 我在App.Address上添加了种植者(现在 - 在我有其他可寻址模型后将更改为寻址)belongsTo属性.对我正在做的事情并不是真的需要,但它在未来可能会有用.
  3. 我在RESTAdapter上设置要嵌入地址:'always'.
  4. App.GrowersEditController上,我只做一个model.save(transaction.commit),并通过API调用自动保存子地址.
  5. 在App.GrowersAddController上,我使用用户输入的Grower和Address数据使用App.Address.createRecordApp.Grower.createRecord方法.然后我使用pushObject方法将Address附加到Grower,然后在Grower上调用save(事务提交).同样,地址数据会自动提交和保存.