Emberjs + data + rails - 未捕获的TypeError:无法调用未定义的方法'map'

时间:2012-05-19 14:36:53

标签: 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

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

5 个答案:

答案 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";
    }
  });