Forum: Rails-ES Problemilla de diseño con rutas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-11 19:16
Veamos, tengo estos dos modelos: Club y Jugador. Me es bastante cómodo
mediante rutas conseguir los listados de las alineaciones de cada club
usando recursos anidados de esta forma:

map.resources :clubs, :has_many => [:jugadores]

Bien, la cosa es que los jugadores pueden ser agentes libres del
mercado, es decir, que no pertenecen a ningún club en algún momento,
¿Cuál creeís que es la forma correcta de modelar mi aplicación para
poder gestionar ambas situaciones?
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2008-11-11 19:24
(Received via mailing list)
No se si es la forma correcta pero yo probablemente lo haria así:

/jugadores/etoo
/equipos/barcelona/jugadores

Donde jugadores en equipo es una collection.

On 11/11/2008, at 19:16, Carlos Belizón
<ruby-forum-incoming@andreas-s.ne
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-11-11 19:24
(Received via mailing list)
2008/11/11 Carlos Belizón <ruby-forum-incoming@andreas-s.net>:

> Veamos, tengo estos dos modelos: Club y Jugador. Me es bastante cómodo
> mediante rutas conseguir los listados de las alineaciones de cada club
> usando recursos anidados de esta forma:
>
> map.resources :clubs, :has_many => [:jugadores]
>
> Bien, la cosa es que los jugadores pueden ser agentes libres del
> mercado, es decir, que no pertenecen a ningún club en algún momento,
> ¿Cuál creeís que es la forma correcta de modelar mi aplicación para
> poder gestionar ambas situaciones?

Una posibilidad es modelar los jugadores a su vez como recursos:

   map.resources :jugadores, :collection => :libres

de manera que para el recurso "jugadores libres" ofreces la direccion

   /jugadores/libres

ademas de

   /jugadores/37

que ya ves tu si lo quieres publicar o no.
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-11 20:16
Xavier Noria wrote:
> Una posibilidad es modelar los jugadores a su vez como recursos:
>
>    map.resources :jugadores, :collection => :libres
>
> de manera que para el recurso "jugadores libres" ofreces la direccion
>
>    /jugadores/libres
>
> ademas de
>
>    /jugadores/37
>
> que ya ves tu si lo quieres publicar o no.

Perdona mi ignorancia pero ¿Qué es una collection? Ya que la API de
Rails no me aclara mucho qué tiene de especial.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-11-11 20:55
(Received via mailing list)
2008/11/11 Carlos Belizón <ruby-forum-incoming@andreas-s.net>:

> Perdona mi ignorancia pero ¿Qué es una collection? Ya que la API de
> Rails no me aclara mucho qué tiene de especial.

La version rapida: permite asociar rutas a otras acciones del
controlador.

Version larga: Supon que tienes una coleccion de recursos como

   # map.resources :posts
   /posts

Un subconjunto de ese recurso se podria publicar como un recurso
individual

   # map.resource :recent_posts
   /recent_posts

pero tambien queda bien publicar ese subconjunto como

   /posts/recent

Para poder expresar eso (entre otras cosas) Rails ofrece esta opcion:

   map.resources :posts, :collection => {:recent => :get}

que enruta por arte de birlibirloque a PostsController#recent.

Los :collection hay que tenerlos en cuenta si usas permalinks sin
leading IDs, ya que podria haber colisiones.
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-13 13:14
Xavier Noria wrote:
> 2008/11/11 Carlos Belizón <ruby-forum-incoming@andreas-s.net>:
>
>> Perdona mi ignorancia pero ¿Qué es una collection? Ya que la API de
>> Rails no me aclara mucho qué tiene de especial.
>
> La version rapida: permite asociar rutas a otras acciones del
> controlador.
>
> Version larga: Supon que tienes una coleccion de recursos como
>
>    # map.resources :posts
>    /posts
>
> Un subconjunto de ese recurso se podria publicar como un recurso
> individual
>
>    # map.resource :recent_posts
>    /recent_posts
>
> pero también queda bien publicar ese subconjunto como
>
>    /posts/recent
>
> Para poder expresar eso (entre otras cosas) Rails ofrece esta opcion:
>
>    map.resources :posts, :collection => {:recent => :get}
>
> que enruta por arte de birlibirloque a PostsController#recent.
>
> Los :collection hay que tenerlos en cuenta si usas permalinks sin
> leading IDs, ya que podria haber colisiones.

Pero me sigue quedando una duda bastante grande:

Dado que tengo sólamente dos modelos, Club y Jugador, de tal forma que
hay una relacion de 1:N de Club a Jugador expresada mediante:

Class Club < ActiveRecord::Base
  has_many :jugadores
end

Class Jugador < ActiveRecord::Base
  belongs_to :club
end

Y tengo actualmente las el fichero routes.rb así:

ActionController::Routing::Routes.draw do |map|
  map.resources :clubs, :has_many => [:jugadores]
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

Teniendo en cuenta que he modificado el scaffold que crea por defecto
Rails para que funcione con las rutas anidadas, ¿Es posible modificar el
archivo routes de esta forma?

ActionController::Routing::Routes.draw do |map|
  map.resources :clubs, :has_many => [:jugadores]
  map.resources :jugadores
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

Y modificar el controlador JugadoresController para que si el usuario
introduce la ruta:

/jugadores/

Se muestre la accion index de JugadoresController que muestre todas las
instancias de la tabla jugadores y que si introduzco la ruta:

/clubs/1/jugadores

Se muestre la accion index de JugadoresController que muestre todas las
instancias de la tabla jugadores que pertenecen al club con :id => 1.

¿Puedo hacer algo así?
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-14 18:44
Lo único que se me ha ocurrido para solucionar el problema es crear un
controlador llamado JugadoresLibresController y copiar todas las
acciones del controlador JugadoresController adaptándolo para solo
mostrar los jugadores que tengan el campo club a null. ¿Véis correcta
esta solución o es una auténtica chapuza?
0fdce938a28a604fd5613a68b0d78fcb?d=identicon&s=25 Jose vicente Ribera pellicer (joripel)
on 2008-11-14 19:55
Carlos Belizón wrote:
> Lo único que se me ha ocurrido para solucionar el problema es crear un
> controlador llamado JugadoresLibresController y copiar todas las
> acciones del controlador JugadoresController adaptándolo para solo
> mostrar los jugadores que tengan el campo club a null. ¿Véis correcta
> esta solución o es una auténtica chapuza?


Hola,que conste que soy bastnte novato en ror, pero almenos ahora que
ya tienes la
seguidad de que te funciona de una forma voia a darte mi idea de como
hacerlo.

Yo probaria con algo asi en el fichero de rutas

map.resources :jugadores
map.resources :jugadores, :collection => :libres

Y en los modelos ya especificaria la relacion belongs y has many,
depende lo que quieras hacer te interesaria forzar a la
coleccion que usara le metodo get, algo asi:

map.resources :jugadores, :collection => {:libres=>:get}

Intentalo, yo creo que de la forma que no tienes implementada queda mas
simple y te das cuenta de lo que haces de un vistazo. La idea es lo que
te ha dicho Xavier mas o menos, prueba a implementarlo

Un saludo

PD: realmente necesitas usar las rutas REST, yo al principio intente
tenerlas encuenta, pero como dices hay que modificar mucho codigo y
ademas complican bastante las cosas cuando crecen, creo que deberias
sopesar la idea de utilizarlas si relamente no es lgo prioritario en tu
aplicacion, no es que te desanime ni mucho menos, pero al menos a mi me
dabana bastantes dolores de cabeza.
B7de309e2f3436b5b1c0b5c18dad089d?d=identicon&s=25 Carlos Belizón Ibañez (paliyoes)
on 2008-11-14 21:17
Jose vicente Ribera pellicer wrote:
>
>
> Hola,que conste que soy bastnte novato en ror, pero almenos ahora que
> ya tienes la
> seguidad de que te funciona de una forma voia a darte mi idea de como
> hacerlo.
>
> Yo probaria con algo asi en el fichero de rutas
>
> map.resources :jugadores
> map.resources :jugadores, :collection => :libres
>
> Y en los modelos ya especificaria la relacion belongs y has many,
> depende lo que quieras hacer te interesaria forzar a la
> coleccion que usara le metodo get, algo asi:
>
> map.resources :jugadores, :collection => {:libres=>:get}
>
> Intentalo, yo creo que de la forma que no tienes implementada queda mas
> simple y te das cuenta de lo que haces de un vistazo. La idea es lo que
> te ha dicho Xavier mas o menos, prueba a implementarlo
>
> Un saludo
>
> PD: realmente necesitas usar las rutas REST, yo al principio intente
> tenerlas encuenta, pero como dices hay que modificar mucho codigo y
> ademas complican bastante las cosas cuando crecen, creo que deberias
> sopesar la idea de utilizarlas si relamente no es lgo prioritario en tu
> aplicacion, no es que te desanime ni mucho menos, pero al menos a mi me
> dabana bastantes dolores de cabeza.

Si te digo la verdad es que creo que mi aplicación no debería estar
enfocada con rutas REST por el simple motivo de que es una especie de
PCFútbol. Pero aún con ello, quiero meterla en algunas partes del
proyecto para que lo valore mi tribunal del PFC.
This topic is locked and can not be replied to.