Problemilla de diseño con rutas

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?

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
<[email protected]

2008/11/11 Carlos Belizón [email protected]:

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.

Xavier N. 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.

2008/11/11 Carlos Belizón [email protected]:

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.

Xavier N. wrote:

2008/11/11 Carlos Belizón [email protected]:

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í?

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?

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.

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.