Lío con REST

Hola a todos,
mi cabeza es un mar de dudas gracias a REST, algo que imagino que en
esencia será sumamente sencillo y a lo que me gustaría que me ayudaseis
a aclarar. Antes de nada, os explicaré lo que intento hacer: la
aplicación web consiste en un portal en el que los usuarios, previamente
registrados, puedan publicar crónicas (lo que viene siendo más o menos
un blog, vamos). La primera duda ya me viene a la hora de tratar a los
usuarios: map.resource :user, map.resources :users o ambas?? En
principio creé el recurso con map.resource :user, para que un usuario
pueda acceder a su cuenta, pero para que el administrador pueda
gestionar a los usuarios deberé usar también map.resources :users, no es
así? Pero lo que más me lía viene ahora, gracias a los recursos
anidados. Según mi opinión, una crónica no tiene sentido sin un usuario,
puesto que es él quien la tiene que crear, por lo tanto map.resource
:user, has_many :chronicles. Pero no me interesa que sólo se puedan ver
las crónicas desde el ámbito de la cuenta de un usuario, si no que
también lo puedan hacer los que no están registrados, por lo tanto añado
map.resources :chronicles, :only => [:index, :show]. Todas las rutas
generadas serán manejadas por el controlador chronicles. Así,
user_chronicles_path y chronicles_path usarán la acción index del
controlador chronicles, aunque deberían tener un efecto distinto (una
listar sólo las publicadas por un usuario y la otra todas). Podría hacer
que user_chronicles_path, en vez de index, usara una acción creada por
mí (published por ejemplo)??
Siento poner todo este tabalenguas, pero me serviría de gran ayuda que
me indicaseis qué falla en mi planteamiento, no creo que haya diseñado
bien la solución, puesto que no puede ser tan lioso.

Muchas gracias

Pero esas no serán las rutas, según yo entiendo, ya que creo un recurso
de la siguiente manera:

map.resource :user, :has_many => :chronicles

por lo tanto, las rutas serán

/user
/user/chronicles
/user/chronicles/

Lo hago con resource en lugar de resources, para que el recurso user
represente la cuenta de un usuario logueado. Si lo hiciese con
resources, cualquiera podría ingresar en la cuenta de otro simplemente
poniendo en la ruta /users/, por lo que también podrían subir
crónicas en nombre de otro, es esto correcto?

Muchas gracias por vuestras respuestas, aunque para vosotros sean
triviales a mí me sirven de mucha ayuda.

Insisto, gracias

David Garcia wrote:

Hola a todos,
mi cabeza es un mar de dudas gracias a REST, …

Muchas gracias

Creo que, para empezar, tendrías que plantearte “QUE” es lo que hará tu
aplicación (a grandes rasgos) y no en detalles como que si los
administradores podrán ver a todos los usuarios o si los usuarios solo
podrán ver sus crónicas… todo eso llegará en el controlador. Piensa en
las rutas que podrás ver en tu navegador.

/users
/users/
/users/<user_id>/chronics
/users/<user_id>/chronics/
… etc

Puede que así te aclares un poco más.

Un Saludo…

David Garcia wrote:

Pero esas no serán las rutas, según yo entiendo, ya que creo un recurso
de la siguiente manera:

map.resource :user, :has_many => :chronicles

por lo tanto, las rutas serán

/user
/user/chronicles
/user/chronicles/

Lo hago con resource en lugar de resources, para que el recurso user
represente la cuenta de un usuario logueado. Si lo hiciese con
resources, cualquiera podría ingresar en la cuenta de otro simplemente
poniendo en la ruta /users/, por lo que también podrían subir
crónicas en nombre de otro, es esto correcto?

Muchas gracias por vuestras respuestas, aunque para vosotros sean
triviales a mí me sirven de mucha ayuda.

Insisto, gracias

Tal como lo planteas es totalmente correcto David. Lo bueno que tiene
esto del desarrollo es que las cosas se pueden hacer de muchas maneras
distintas y todas correctas o incorrectas… dependerá del que las
plantea.

Siguiendo tu línea de planteamiento te podrías ahorrar el “user”,
haciendo un formulario de login y almacenando el “id” del usuario en la
variable de sesión para luego, en el controlador, hacer las búsquedas,
modificaciones o inserciones con ese dato.

User.find(session[“user_id”])

También te puedes plantear la línea de “/users/<user_id>/chronicles” y
en el controlador comprobar que el “id” del usuario que accede (el de la
sesión) corresponde con el parámetro “user_id” de la URL.

before_filter :check_user

Seguro que a nuestro compañeros se les ocurre otras mucha maneras de
hacer esto, pero creo que la que tu escojas, será la correcta… piensa
que en ruby se puede hacer casi de todo :wink:

Un Saludo…