/ / Comportamiento extraño con modelos / colecciones de red troncal, ¿Cómo obtengo el ID de un modelo recién creado? - Ruby-on-Rails, backbone.js

Comportamiento extraño con modelos / colecciones de red troncal, ¿Cómo obtengo el ID de un modelo recién creado? - Ruby-on-Rails, backbone.js

Tengo un comportamiento extraño al crear modelos con backbone.js y rails 3.0.7 (y coffeescript).

Creo un modelo con

@model = @collection.create
param : a_param
param : another_param

Esto se guarda en los rieles bien y el objeto devuelto es lo que espero (cuando console.log @model devuelve un modelo de red troncal de aspecto adecuado con id, cid, atributos ... etc).

Cuando console.log @ model.id devuelve undefined (aunque estaba allí en console.log @model).

Cuando console.log @collection devuelve la colección esperada, pero cuando console.log @ collection.models devuelve una matriz vacía.

Cuando carga el @collection a través de json en la página (rieles):

( json_from_the_page : #{@collection.to_json} )

@collection = new CollectionName()
@collection.reset options.json_from_the_page

y console.log @ collection.models ¿todo funciona bien así que debe ser algo que ver con guardar en el servidor?

¿Alguna idea o lugar en el que deba buscar en el código de la red troncal para depurar más?

Respuestas

2 para la respuesta № 1

De acuerdo con el código fuente de Backbone, la ID de un objeto solo se establece si recibe la ID durante la construcción. Carriles está configurando la ID, así que cuando la pides a los rieles, obtienes una, pero no la obtienes cuando construyes un nuevo objeto.

Esto es por diseño; backbone asume que la identificación canónica será establecida por el servidor. Entonces, para un modelo "recién hecho", la ID no se establece automáticamente (y el método del modelo isNew() devoluciones true)

Si quieres que el modelo recién hecho tenga una identificación,guárdelo inmediatamente (y no actúe sobre él hasta que el guardado regrese) para que su servidor pueda proporcionar una ID. Si tiene una ID programática que sea confiable en el lado del cliente, anule initialize() para proporcionar uno durante la construcción si no se proporciona uno en el campo de atributos.


0 para la respuesta № 2

Tuve el mismo problema. Estaba tratando de guardar un modelo y agregarlo a una colección. Aunque esto no funcionó, no pude hacer ninguna manipulación al modelo recién creado hasta que actualicé la página. Esto sucedía porque, aunque estaba guardando el modelo, todavía no tenía la ID creada por el backend de los rieles.

Para solucionar este problema, necesitaba guardarel modelo, establece el id del nuevo modelo en función de la respuesta de los rieles, y ENTONCES lo agrega a la colección. Eche un vistazo al código de ejemplo a continuación (escrito en coffeescript). Estoy declarando una función de éxito para el modelo (así como una función de error). En la función de éxito, obtengo el ID en @model ["atributos"] ["0"] que tiene la respuesta de los rieles almacenados. Su configuración podría ser un poco diferente.

attrs =
name: "model_name"

options =
success: (data, textStatus, jqXHR) =>
@model.set
id: @model["attributes"]["0"]["id"]
@collection.add(@model)
error: (jqXHR, textStatus, errorThrown) =>
alert "Failed to create model"

@model.save(attrs, options)