ruby on rails - Emberjs+data+rails-UnEught TypeError: no se puede llamar al método ''map'' de undefined
ruby-on-rails ember.js (5)
Cuando estoy tratando de cargar datos de rails db con datos de emberjs + ember, recibo este error
Unkeught TypeError: no se puede llamar al método ''map'' de undefined
Aquí está el código de 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)
El controlador obtiene datos JSON correctos. Intenté mapear el código de los ejemplos encontrados en Internet, pero nada me ayudó. ¿Algunas ideas? Creo que estoy haciendo algo mal. Gracias de antemano por cualquier ayuda.
Ember-Data espera encontrar todos los resultados anidados bajo la forma plural del modelo:
Qué datos de ember está esperando:
{
"users": [
{
"activated": null,
"created_at": "2012-05-14T19:35:44Z",
"email": "[email protected]",
"id": 1,
"name": "john doe",
"updated_at": "2012-05-15T20:23:06Z"
}
]
}
Qué está obteniendo en tu ejemplo:
[
{
"activated": null,
"created_at": "2012-05-14T19:35:44Z",
"email": "[email protected]",
"id": 1,
"name": "john doe",
"updated_at": "2012-05-15T20:23:06Z"
}
]
Específicamente, el error viene de la respuesta de JSON y ejecutando el "mapa" sobre todo lo que está debajo de la tecla "usuarios", que en su caso no existe, por lo que se llama a "mapa" en "indefinido".
Tuve exactamente el mismo problema. Lo que me solucionó fue agregar el nodo raíz al representar el JSON en la acción de index
en mi controlador. Eso significaba cambiar esta línea:
format.json { render json: @things }
a esto:
format.json { render json: { things: @things }}
Esto se debe a que Ember-data requiere el nodo raíz en el objeto JSON, pero Rails no lo incluye de forma predeterminada.
Espero que eso ayude.
¡Finalmente encontré la solución!
No estoy seguro de si esto debería hacerse de esta manera, pero fue suficiente para deshacerse de las confirmaciones masivas. Entonces, ¿cómo debería verse la tienda?
Cosmetics.store = DS.Store.create
revision: 4
adapter: DS.RESTAdapter.create
bulkCommit: false
estaba causando el Uncaught TypeError: Cannot call method ''map'' of undefined
bulkCommit: false
Uncaught TypeError: Cannot call method ''map'' of undefined
error Uncaught TypeError: Cannot call method ''map'' of undefined
.
Este problema parece estar relacionado solo con los datos de ascua cuando se usan en aplicaciones de rieles.
Parece que me apresuré un poco porque lo que parecía resolver el problema, causó otros;
Encontrado el problema, no estoy seguro acerca de la solución.
Si su recurso se sirve en un espacio de nombre, por ejemplo
App.Event = DS.Model.extend({
name: DS.attr(''string''),
});
App.Event.reopenClass({
url: ''api/event''
})
Cuando ember-data analiza la respuesta json, hace algo como json[plural]
en findAll
que debe ser json[''events'']
, sin embargo, el plural se calcula que es json[''api/events'']
, y por lo tanto el error. Preguntaré alrededor y probablemente subiré un boleto para esto.
Actualizar
He creado un boleto para esto aquí
Solución
Como un hack, estoy haciendo esto:
def index
respond_to do |format|
format.json { render json: { ''api/events'': Event.all } }
end
end
La causa raíz del problema es la función de pluralizar en rest_adapter.js, por lo tanto, la solución es solucionarlo;)
DS.RESTAdapter.reopenClass({
pluralize: function(name) {
if (!this.plurals[name])
name = name.substring(name.lastIndexOf(''/'')+1);
return this.plurals[name] || name + "s";
}
});