当我尝试使用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)
Controller获取正确的JSON数据。我已经尝试从互联网上找到的示例中映射代码,但没有任何帮助。有任何想法吗?我想我做错了。提前感谢您的帮助。
答案 0 :(得分:4)
我遇到了完全相同的问题。为我解决的是在我的控制器中的index
动作中渲染JSON时添加根节点。这意味着改变这一行:
format.json { render json: @things }
到此:
format.json { render json: { things: @things }}
这是因为Ember-data需要JSON对象中的根节点,但Rails默认不包含它。
我希望有所帮助。
答案 1 :(得分:4)
发现问题,不确定解决方案。
如果您的资源是在命名空间下提供的,例如
App.Event = DS.Model.extend({
name: DS.attr('string'),
});
App.Event.reopenClass({
url: 'api/event'
})
当ember-data解析json响应时,json[plural]
中的findAll
应该是json['events']
,但复数计算为json['api/events']
,因此错误。我会问周围,可能会为此提出一张票。
<强>更新强>
我已为此here
创建了一张票解决方法强>
作为一个黑客,我这样做:
def index
respond_to do |format|
format.json { render json: { 'api/events': Event.all } }
end
end
答案 2 :(得分:3)
ember-data期望findAll结果嵌套在模型的复数形式下:
期待什么样的ember数据:
{
"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”在“undefined”上被调用。
答案 3 :(得分: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有关。
我似乎已经赶紧一点,似乎解决了这个问题,导致了其他人; |
答案 4 :(得分: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";
}
});