6

当我尝试使用 emberjs + ember 数据从 rails db 加载数据时,出现此错误

未捕获的类型错误:无法调用未定义的方法“地图”

这是咖啡脚本代码:

window.Cosmetics = Ember.Application.create

Cosmetics.store = DS.Store.create
  revision: 4
  adapter: DS.RESTAdapter.create 
    bulkCommit: false

Cosmetics.admin_user = DS.Model.extend({
  name: DS.attr('string')
  email: DS.attr('string')
});

Cosmetics.view = Ember.View.extend
  templateName: 'ember/views/aaa'

Cosmetics.admin_user.reopenClass
  url: 'admin/user'

Cosmetics.store.findAll(Cosmetics.admin_user)

控制器获取正确的 JSON 数据。我尝试从互联网上找到的示例中映射代码,但没有任何帮助。有任何想法吗?我想我做错了什么。提前感谢您的帮助。

4

5 回答 5

4

我有完全相同的问题。index为我解决的问题是在我的控制器的操作中呈现 JSON 时添加根节点。这意味着改变这一行:

format.json { render json: @things }

对此:

format.json { render json: { things: @things }}

这是因为 Ember-data 需要 JSON 对象中的根节点,但 Rails 默认不包含它。

我希望这会有所帮助。

于 2012-05-28T20:08:17.947 回答
4

找到问题了,不知道解决办法。

如果您的资源在命名空间下提供服务,例如

App.Event = DS.Model.extend({
  name: DS.attr('string'),
});

App.Event.reopenClass({
  url: 'api/event'
})

当 ember-data 解析 json 响应时,它会执行类似json[plural]in findAllwhich should be的操作json['events'],但是复数计算为 be json['api/events'],因此会出现错误。我会四处打听,可能会为此提出一张票。

更新

我在这里为此创建了一张票

解决方法

作为一个黑客,我正在这样做:

def index
  respond_to do |format|
    format.json { render json: { 'api/events': Event.all } }
  end
end
于 2012-06-14T21:38:56.600 回答
3

ember-data 期望 findAll 结果嵌套在模型的复数形式下:

ember-data 的预期:

{
    "users": [
        {
            "activated": null, 
            "created_at": "2012-05-14T19:35:44Z", 
            "email": "john@doe.com", 
            "id": 1, 
            "name": "john doe", 
            "updated_at": "2012-05-15T20:23:06Z"
        }
    ]
}

在您的示例中得到了什么:

[
    {
        "activated": null, 
        "created_at": "2012-05-14T19:35:44Z", 
        "email": "john@doe.com", 
        "id": 1, 
        "name": "john doe", 
        "updated_at": "2012-05-15T20:23:06Z"
    }
]

具体来说,错误来自 ember 获取 JSON 响应并在“users”键下的所有内容上运行“map”,在您的情况下它不存在,因此“map”被称为“未定义”。

于 2012-05-24T16:21:11.033 回答
0

问题的根本原因是rest_adapter.js中的复数函数,因此解决方案是修复它;)

  DS.RESTAdapter.reopenClass({
    pluralize: function(name) {
      if (!this.plurals[name])
        name = name.substring(name.lastIndexOf('/')+1);

      return this.plurals[name] || name + "s";
    }
  });
于 2012-07-09T15:01:51.780 回答
0

我终于找到了解决方案!

我不确定这是否应该以这种方式完成,但这足以摆脱批量提交。所以商店应该是这样的:

Cosmetics.store = DS.Store.create
  revision: 4
  adapter: DS.RESTAdapter.create 

bulkCommit: false导致Uncaught TypeError: Cannot call method 'map' of undefined错误。

在 Rails 应用程序中使用时,此问题似乎仅与 ember-data 有关。

我似乎有点匆忙,因为似乎解决了问题,引起了其他人;|

于 2012-06-03T14:33:50.397 回答