2011-12-14 14 views
7

Los rieles tienen recursos anidados por un tiempo, y se han usado con exceso (o se han usado en exceso). Digamos que tenemos dos modelos, artículo y comentario.¿Puede SpineJS url() soportar el recurso anidado en rieles?

class Article < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :article 
end 

Definir el recurso anidado en routes.rb

resources :articles do 
    resources :comments 
end 

Así que ahora, podemos enumerar los comentarios de artículo específico: http://localhost:3000/articles/1/comments

Pero la columna vertebral sólo puede hacer url de solicitud posterior para crear Artículo y comentario como este:

/articles 
/comments 

¿Cómo hacer que la URL de Spine para Ajax solicite de esta manera?

/articles/1/comments 

Sé que puedo anular la url() en el Comentario Modelo para los comentarios de recuperación, pero ¿qué pasa con la creación de un nuevo disco?

También reviso el código fuente, lo que encontré es que el método create() en el módulo Ajax de Spine no se preocupa por la función url() personalizada en el caso de Comment. lo que quiero es pasar el article_id y usarlo con mi función url() personalizada para generar url, luego puedo publicar en el servidor para crear.

¿Es posible sin horquilla y versión modificada de Spine fo para mí?

por cierto: lo siento por mi Inglés, deseamos a todos ustedes puedan entender lo que quiero decir sobre :-)

Gracias y un saludo,

Respuesta

2

propiedad url del modelo puede ser un valor o Una función. Entonces usted podría hacer:

class Comment extends Spine.Model 
    @configure "comment", "article_id" 
    @extend Spine.Model.Ajax 

    @url: -> 
    "articles/#{article_id}/comments" 

o algo similar. El módulo ajax evaluará esta propiedad y la usará como el punto final del recurso al generar solicitudes.

+0

Como dice Daniel en la pregunta, esto no funciona para la creación. – Pelle

+0

Esto no funciona para crear URL ya que la función Ajax.getURL se pasa al modelo de comentario y no a una instancia de un comentario. Entonces no tiene idea de qué es un article_id. Verifique mi respuesta :) – SpoBo

0

Tengo el mismo problema ya que este parece ser uno de los mayores problemas con Spine.

Es bastante sencillo de implementar con BackBone debido a su simplicidad, pero las partes internas de Spine son bastante complejas, lo que lo hace bastante difícil.

Estoy tratando de implementar stand volverá si tengo una solución.

+0

no tendría una solución, ¿o sí? :pag – SpoBo

2

añadir

#= require spine/relation 

a app/javascript/app/views/index.js.café

para agregar la extensión relación

class App.Project extends Spine.Model 
    @configure 'Project', 'name' 
    @extend Spine.Model.Ajax 
    @hasMany 'pages', 'projects/page' 

class App.Page extends Spine.Model 
    @configure 'Page', 'name', 'content' 
    @extend Spine.Model.Ajax 
    @belongsTo 'project', 'Project' 

en javascript consola

App.Project.find(the_id).pages().create({name:"asd"}) 

más información en http://spinejs.com/docs/relations

el enlace se encuentra en la parte inferior de la documentación spinejs modelo

2

I tener una solución:

http://groups.google.com/group/spinejs/browse_thread/thread/6a5327cdb8afdc69?tvc=2

https://github.com/SpoBo/spine

hice un tenedor que anula la forma de URL se genera en el módulo de ajax. Esto permite que la url de creación contenga bits de los datos de instancia del modelo. Por ejemplo:/articles/1/comments. Funciona con crear, actualizar, etc.

class App.Post extends Spine.Model 
    @configure 'Post', 'channel_id', 'title' 
    @extend Spine.Model.Ajax 

    resourceUrl: -> 
    "channels/#{@channel_id}/posts" 

    @hasOne 'channel', 'App.Channel' 
0

Siguiendo trozo de código que funcionó para mí, pero luego no lo hizo ... (y lo modifica esta respuesta). Entonces esta NO es una buena solución porque Spine hace colaciones de Ajax. Siempre funcionó para un primer comentario, pero no para las llamadas posteriores, ya que la llamada a super volvería sin haber enviado el PUT/POST.

class Comment extends Spine.Model 
    @configure "comment", "article_id" 
    @extend Spine.Model.Ajax 

    # hack for nested: @article_id is only set correctly during save 
    @article_id = "?" 
    @url: =>"/articles/#{@article_id}/comments" 

    save:()=> 
    # hack for nested resources (see @url) 
    Comment.article_id = @article_id 
    super 
    Comment.article_id = "?" 
Cuestiones relacionadas