2012-03-01 10 views
5

Soy novato en el lado del cliente Javascript MVC, primera aplicación de ember.js.¿Cómo se usan los controladores de reposo ember para trabajar con los recursos anidados de Rails3?

Sigo las instrucciones aquí para usar ember-rest en la creación de un tipo de modelos anidados posteriores a los comentarios.

http://www.cerebris.com/blog/2012/01/26/beginning-ember-js-on-rails-part-2/

empecé a escribir recursos anidados de la siguiente manera:

resources :conversations do 
    resources :comments 
    end 

Ahora el problema es cuando tuve que escribir el controlador brasa reposo:

App.commentsController = Ember.ResourceController .create ({ resourceType: App.Comment resourceURL: '/ conversaciones /: id/comments' });

No creo que pueda usar el: id en el medio; ¿Cómo podría solucionar eso? ¿Ember-data resuelve esto? Parece que la integración de spine.js será un poco más fácil de manejar. ¡Gracias por adelantado!

Respuesta

6

He tenido la intención de responder a tu comentario en mi publicación de ayer, así que me alegra que hayas hecho la pregunta aquí.

Debo comenzar diciendo que escribí ember-rest como una capa muy delgada sobre jQuery.ajax. No es terriblemente avanzado, y ni siquiera hay una instalación integrada para asociaciones. Sin embargo, estoy considerando agregar uno ahora que esta lib está siendo bastante útil. Como verá en el siguiente código, este concepto puede manejarse, pero debería abstraerse mejor en la lib.

Las asociaciones se pueden gestionar creando una instancia de un controlador de recursos dentro de cada recurso principal. Cada controlador de recursos particular debe administrar una matriz particular de recursos, pero no necesariamente todos los recursos de un tipo particular.

En su caso, se podría extender ResourceController para gestionar los comentarios para las conversaciones:

App.ConversationComments = Ember.ResourceController.extend({ 
    resourceType: App.Comment, 

    // override _resourceUrl() to base the url on the conversation 
    _resourceUrl: function() { 
     return this.get("conversation")._resourceUrl() + "/comments"; 
    } 
    }); 

A continuación, podría configurar una instancia de ConversationComments para cada conversación:

App.Conversation = Ember.Resource.extend({ 
    resourceUrl:  '/conversations', 
    resourceName:  'conversation', 
    resourceProperties: ['prop1', 'prop2'] 

    // init comments 
    init: function() { 
     this.set("comments", App.ConversationComments.create({ conversation: this })); 
    } 
    }); 

Por último, pero no menos importante, Necesitará recuperar los comentarios para cada conversación:

conversation.get("comments").findAll(); 

Si tiene todos los comentarios en json, podría usar alternativamente loadAll(). Dónde y cuándo llame a loadAll() o findAll() depende de las necesidades de su aplicación. Obviamente, querrá reducir el número de llamadas ajax para obtener el mejor rendimiento.

Ember-data es un proyecto mucho más ambicioso que ember-rest, y ya tiene soporte para asociaciones, así como funciones avanzadas como transacciones. Dicho esto, está en desarrollo muy activo con un API cambiante. Si eres paciente y estás dispuesto a profundizar en el código, te recomiendo que lo pruebes. Cuando el polvo se asiente un poco, también planeo publicar sobre él.

+0

Muchas gracias por su respuesta detallada. Estoy tratando de ver cuántos cambios necesito hacer para usar los datos de las brasas. Sigue pensando. –

+0

Empecé a implementar su enfoque y parece que PUT o envíe la función de edit.js que llama al comentario.saveResource() aún falla debido a PUTing the json en la ruta "/ comments" en lugar de "/ conversation /: conversation_id/comments /: id" ¿Cómo crearía el duplicado como sugirió en su publicación de blog para su edición? –

+0

No tengo en cuenta mi pregunta, yo mismo eliminé los "recursos: comentarios" y solo mantuve la configuración de recursos anidados en routes.rb –

Cuestiones relacionadas