【问题标题】:Ember associations and nested URLsEmber 关联和嵌套 URL
【发布时间】:2012-10-22 14:27:36
【问题描述】:

我们正在使用 Ember 数据和 Rails 实现一项功能,但一直遇到困难。我们不确定这是我们的代码有问题,是 Ember 或 Ember 数据的错误,还是只是因为缺乏文档而没有得到它。

任何帮助将不胜感激。

导轨

我们有一个待办事项列表,其中包含多个条目。在 Rails 中,它们的设置如下:

class ToDo < ActiveRecord::Base
   has_many :to_do_entries, dependent: :destroy
   alias_method :entries, :to_do_entries
   validates_presence_of :title
end

class ToDoEntry < ActiveRecord::Base
  attr_accessible :completed_at, :is_deleted, :priority, :title

  belongs_to :to_do
  alias_method :parent, :to_do

  validates_presence_of :to_do, :title     
end

路由设置为嵌套:

resources :to_dos do 
   resources :to_do_entries do
   end
end

所以最终的 URL 最终是 /to_do/:to_do_id/to_do_entry/:to_do_entry_id

我们正在使用 active_model_serializers gem 并设置了以下序列化程序:

class ToDoSerializer < ActiveModel::Serializer
  attributes :id,
             :title

  has_many :to_do_entries, embed: :objects
end

class ToDoEntrySerializer < ActiveModel::Serializer
  attributes :id,
             :to_do_id,
             :title,
             :priority

  has_one :to_do
end

余烬

我们使用的是 Ember 数据和 REST 适配器,等效模型设置如下:

App.ToDo = DS.Model.extend({
  title: DS.attr('string'),
  entries: DS.hasMany('App.ToDoEntry', { embedded: true })
});

App.ToDoEntry = DS.Model.extend({
  title: DS.attr('string'),
  to_do_id: DS.attr('number'),
  priority: DS.attr('number'),
  todo: DS.belongsTo('App.ToDo')
});

问题

我的理解是,我们应该能够通过在控制台中使用以下命令直接从 ToDo 访问条目列表:

> t = App.ToDo.find(21)
> e = t.get("entries")

这似乎确实有效,但只是返回一个类,我不知道如何调试它并查看它是否有效。

我有两个具体问题:

  1. 我们如何使用控制台调试关联并确保它们正常工作。

  2. 如果我们单独加载条目(而不是将它们嵌入到父级中),我们如何使它使用像上面那样的嵌套路由?

【问题讨论】:

  • 你可以做类似t.get("entries").toArray()的事情。您将能够验证 ID。您可以执行t.get("entries").toArray()[0].get('title') 之类的操作来检查给定的属性。我不相信 REST 适配器开箱即用地支持嵌套路由。实际上,我打开了一个关于它的issue,现在它已经关闭了。我还没有机会尝试在我的适配器中实现嵌套路由(我现在正在服务器上使用解决方法)。

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


【解决方案1】:

首先,从模型中获取关联会返回一个 DS.ManyArray,其中包含您假设的对象。
有几种调试方法,首先它响应普通数组方法,例如lengthfirstObjectlastObjectobjectAt
如果这还不够有用,它还会响应 toArray 将其转换为 vanilla JS 数组。

不幸的是,最新的 ember-data 迭代实际上删除了嵌入的记录(不过我认为这可能是暂时的)。目前,默认 RESTAdapter 不支持嵌套资源 URL,但您可以随时对其进行自定义以满足您的需求

然而,在将嵌套资源放入核心方面正在进行工作,请参阅 PR 的 #367#257

【讨论】:

  • 太好了,谢谢。这真的很有帮助。看起来我们已经完成了一半,但是在命名和变形器(或缺少)方面存在问题。我会写一篇博文来分享我们一路走来的发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多