【问题标题】:Ember.js with Rails accepts_nested_attributes_for and polymorphic has_many/belongs_to带有 Rails 的 Ember.js 接受_nested_attributes_for 和多态 has_many/belongs_to
【发布时间】:2013-07-02 17:24:43
【问题描述】:

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

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

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

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

更新:

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

【问题讨论】:

    标签: json api ember.js ruby-on-rails-4


    【解决方案1】:

    以下是基于@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

    【讨论】:

    【解决方案2】:

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

    在客户端(Ember)端:

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

    【讨论】:

    • @yuri Inseated of has_many 我有一个 belongs_to 关系,所以我想有类似 address_attributes 的东西发送到服务器。非常感谢您的提示,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-01-13
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多