4

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

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 控制器,它返回并可以创建/更新具有嵌入式地址属性的 Growers。我还有一个具有正确路由的地址控制器,以便可以查看/创建/更新特定种植者的地址。后者更像是“以防万一”,我不确定是否需要将地址作为单独的有效负载返回/更新/创建。

我开始尝试拼凑一个 Ember 应用程序,它允许我在查看/编辑/创建 Grower 及其地址的同时查看/编辑/创建一个种植者。谁能指出我现有的真实或示例应用程序可以做到这一点?我将在进行过程中发布我的代码,但我已经知道我会遇到麻烦的一些领域:

  1. Rails 返回/期望名为addresses_attributes的嵌套参数。我敢肯定,Ember 不使用该约定。解决这个问题的最佳方法是什么?

  2. 由于多态关联(Grower 以外的对象可以是可寻址的),在 API/Address 端,为了获得正确的 belongs_to 对象,Rails 使用addressable_idaddressable_type。在此示例中,addressable_type 将是“Grower”,addressable_id 将是 grower_id 值。在 Ember 方面如何翻译它?

更新:

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

4

2 回答 2

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

于 2014-07-30T11:14:38.263 回答
6

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

在客户端(Ember)端:

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