Ruby on rails Emberjs+;数据+;rails-未捕获类型错误:无法调用方法';地图';未定义的

Ruby on rails Emberjs+;数据+;rails-未捕获类型错误:无法调用方法';地图';未定义的,ruby-on-rails,ember.js,ember-data,Ruby On Rails,Ember.js,Ember Data,当我试图用emberjs+ember数据从rails db加载数据时,我遇到了这个错误 未捕获的TypeError:无法调用未定义的方法“map” 以下是coffescript代码: window.Cosmetics = Ember.Application.create Cosmetics.store = DS.Store.create revision: 4 adapter: DS.RESTAdapter.create bulkCommit: false Cosmetic

当我试图用emberjs+ember数据从rails db加载数据时,我遇到了这个错误

未捕获的TypeError:无法调用未定义的方法“map”

以下是coffescript代码:

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数据。我试着从互联网上找到的示例映射代码,但没有任何帮助。有什么想法吗?我想我做错了什么。提前感谢您的帮助。

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

余烬数据所期望的:

{
    "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”,在您的情况下,该键不存在,因此在“undefined”上调用“map”。

我遇到了完全相同的问题。解决这个问题的方法是在控制器中的
索引
操作中呈现JSON时添加根节点。这意味着改变这一行:

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

format.json { render json: { things: @things }}
这是因为Ember数据需要JSON对象中的根节点,但Rails默认不包含它

我希望这能有所帮助。

我终于找到了解决办法

我不确定是否应该这样做,但这足以消除批量提交。因此,商店应该是这样的:

Cosmetics.store = DS.Store.create
  revision: 4
  adapter: DS.RESTAdapter.create 
bulkCommit:false
导致了
uncaughttypeerror:无法调用未定义的
错误的方法“map”

这个问题似乎只与rails应用程序中使用的余烬数据有关


我似乎有点匆忙,因为似乎解决了问题的东西,引起了另一个问题|

发现问题,不确定解决方案

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

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

App.Event.reopenClass({
  url: 'api/event'
})
当余烬数据解析json响应时,它在
findAll
中执行类似于
json[multiple]
的操作,这应该是
json['events']
,但是复数被计算为
json['api/events']
,因此产生错误。我会四处打听,也许会为此买单

更新

我已经为此创建了一张票证

解决方法

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

def index
  respond_to do |format|
    format.json { render json: { 'api/events': Event.all } }
  end
end

问题的根本原因是函数的多重化,因此解决方法是修复它;)


你能给出一个从服务器返回的对象的例子吗?旧版本的ember和更新版本的数据也有一个bug,会触发上述错误,您使用的是什么版本的ember?@CoryLoken这是rails返回的示例对象-。关于emberjs版本,我使用的是ember rails gem附带的版本,但出于安全考虑,我尝试使用从github下载的最新版本(0.9.7.1),但没有成功。使用ember rails 0.6.0打包的emberjs版本也有同样的问题吗?恐怕不是这样。我尝试过在控制器中添加一个符号
:users
response\u,使用
来获得嵌套响应,但仍然是相同的错误。ember data latest.js中的
ids=hashes.map(function(hash){…}
)不断出现问题。这或多或少是@tvon建议的。这似乎是个问题,但添加根节点没有帮助(很遗憾)。无论如何,谢谢。这很奇怪。你试过调试它吗?你确定你使用的是最新版本吗?
  DS.RESTAdapter.reopenClass({
    pluralize: function(name) {
      if (!this.plurals[name])
        name = name.substring(name.lastIndexOf('/')+1);

      return this.plurals[name] || name + "s";
    }
  });