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

时间:2013-07-02 17:24:44

标签: json api 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

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

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

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

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

  3. 更新:

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

2 个答案:

答案 0 :(得分: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)
)

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

答案 1 :(得分:6)

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

在客户端(Ember)方面:

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