Rails 2 / REST: rutas en recursos anidados?

Hola, estoy poniéndome al día con esto de REST y me estoy haciendo un
poco de lío con los recursos anidados. Os pongo un ejemplo para ver si
me podéis arrojar un poco de luz en el tema, o indicarme
algúntutorial actualizado.

En mi ejemplo, tengo una aplicación de blog multiusuario. Cada usuario
tiene muchos posts, cada post pertenece a un usuario y tiene muchos
comentarios, y cada comentario pertenece a un usuario y a un post.

Lo que quiero es anidar las rutas para que un post sólo tenga sentido
dentro del contexto de un usuario determinado (su autor), y los
comentarios, dentro del contexto del post al que pertenecen.
Ademásquiero poder ver el controlador de usuarios sin ningún contexto por
encima. O sea, rutas como estas:

http://localhost:3000/users
http://localhost:3000/users/1
http://localhost:3000/users/1/posts
http://localhost:3000/users/1/posts/1/
http://localhost:3000/users/1/posts/1/comments
http://localhost:3000/users/1/posts/1/comments/1

Esto lo he conseguido con las siguientes rutas, y con un before_filter
en el controlador de posts y comments para que cargue el contexto del
padre:

map.resources :users

map.resources :posts

map.resources :comments

map.resources :posts do |post|
post.resources :comments
end

map.resources :users do |user|
user.resources :posts do |post|
post.resources :comments
end
end

El caso es que funciona, pero no entiendo por qué necesito definir estas
dos:

map.resources :posts

map.resources :comments

Quiero decir, si las quito no funciona, pero yo no quiero poder entrar
directamente a /posts sin el contexto de usuario, ni a /comments sin
el contexto del post…

También he probado con el azucar sintáctico siguiente:

map.resources :users, :has_many => :posts
map.resources :posts, :has_many => :comments

Pero tampoco va bien…

¿Alguien me echa una manita? Gracias!

Que quieres decir con que no te funciona si quitas
map.resources :posts?

Mira las rutas que te genera Rails con rake routes.

Francesc

On Dec 21, 2007, at 7:02 PM, Jaime I. wrote:

comentarios, dentro del contexto del post al que pertenecen. Además
quiero poder ver el controlador de usuarios sin ningún contexto por
en el controlador de posts y comments para que cargue el contexto del
end
map.resources :posts
map.resources :posts, :has_many => :comments
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


name. Francesc E. i Martí
voice. +34 678.681.603

Hola Francesc, me refiero a que si lo dejo así el routes.rb

map.resources :users

map.resources :posts do |post|
post.resources :comments
end

map.resources :users do |user|
user.resources :posts do |post|
post.resources :comments
end
end

(o sea quito ‘map.resources :posts’ y ‘map.resources :comments’), me
falla cuando voy a:

http://localhost:3000/users/1/posts/1/comments

Con este error:

undefined method `comment_path’ for #ActionView::Base:0xb68f18ec

En esta línea:

<%= link_to ‘Show’, comment_path(comment) %>

Jaime

El 21/12/07, Francesc E. [email protected]
escribi

Jaime I.
escribió:> post.resources :comments

undefined method `comment_path’ for #ActionView::Base:0xb68f18ec

En esta línea:

<%= link_to ‘Show’, comment_path(comment) %>

Al anidar un recurso dentro de otro tienes que indicar obligatoriamente
el padre en los helpers del hijo para propocionar a éste un contexto. En
tu ejemplo sólo tendrás disponible el helper
user_post_comment_path(user, post, comment), y no el
comment_path(comment). De igual forma tendrás user_post_path(user, post)
y no post_path(post).


Raul M. - Freelance Web D.
http://raul.murciano.net

2007/12/21, Raul M. [email protected]:

Al anidar un recurso dentro de otro tienes que indicar obligatoriamente
el padre en los helpers del hijo para propocionar a éste un contexto. En
tu ejemplo sólo tendrás disponible el helper
user_post_comment_path(user, post, comment), y no el
comment_path(comment). De igual forma tendrás user_post_path(user, post)
y no post_path(post).

Acabáramos… entonces es que estaba poniendo mal los helpers… Gracias!

Estoy probando a dejarlo en una sola ruta anidada:

map.resources :users do |user|
user.resources :posts do |post|
post.resources :comments
end
end

Y parece que lo voy consiguiendo…

On Dec 21, 2007, at 7:53 PM, Raul M. wrote:

Al anidar un recurso dentro de otro tienes que indicar
obligatoriamente
el padre en los helpers del hijo para propocionar a éste un contexto.

Seguro que ya querias decir esto, pero dejame comentar por si acaso se
lee literal que es obligatorio en el contexto de lo que quiere
conseguir Jaime, ie salvo que el hijo sea tambien un recurso en si
mismo. En tal caso las URLs se pueden generar tanto con el helper
corto como con el helper que refleja la jerarquia.

Por ejemplo puede que para crear un comentario quieras ir por la
jerarquia para indicar quienes son los padres, pero para borrarlo te
sea mas sencillo enviar DELETE /comments/{id}. Si ese uso te vale
configuras los dos accesos (no es lo que quiere Jaime en este caso).

– fxn

Xavier N.
escribió:> corto como con el helper que refleja la jerarquia.
Eso eso, si el hijo se define aparte como recurso sin anidar la cosa
cambia: me refería solo al caso del anidamiento :slight_smile:


Raul M. - Freelance Web D.
http://raul.murciano.net

Gracias a todos por vuestra ayuda!

Para ver si me ha quedado claro esto de las rutas anidadas con REST /
Rails 2, he escrito un tutorial con códigos de ejemplo [1]. A ver si
no he hecho muchas burradas… ya me diréis… :stuck_out_tongue:

[1] http://tinyurl.com/2fd5ga

Una duda… en este ejemplo de rutas anidadas:

map.resources :users do |user|
user.resources :posts do |post|
post.resources :comments
end
end

Dentro del controlador de posts, para coger el contexto de usuario, lo
cojo desde params[:user_id].

Dentro del controlador de comments, igualmente… params[:user_id] y
params[:post_id].

En cambio, en el controlador de users, el usuario lo cojo con
params[:id] y no con params[:user_id]. Igual sucede en el de posts, el
post lo cojo con params[:id] y no con params[:post_id].

¿No sería más cómodo que se mapeara automáticamente de manera que
siempre fuera params[:user_id], tanto si estoy en el controlador de
usuarios como en el de posts o en el de comentarios?

Jaime

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs