IIC2513-2018-2 / syllabus

Material y coordinación del curso
10 stars 4 forks source link

Perdida de params en ctx.router.url #45

Closed jerosalazar closed 5 years ago

jerosalazar commented 5 years ago

Creé un nuevo modelo para hacer mis mensajes, en el que (en simples palabras) tengo los atributos fromUser, toUser y body. Luego de crear el modelo y la tabla en la bdd, creé las rutas y mi problema empieza aquí: cuando intento acceder a cualquier ruta de mensajes, pierdo los ctx.params.

Por ejemplo, si me encuentro en el show de un usuario X, y defino sendMessagePath: ctx.router.url('new-message', {fromId, toId}), al redireccionarme a la vista del mensaje nuevo, pierdo los parámetros de fromId y toId (console.log(ctx.params)arroja {}). Revisé bastantes veces la sintaxis, así que creo no tener problemas ahí. Pero quizás me haya faltado definir algo en el archivo de routes o hay algún detalle que olvidé.

¿Alguna idea de que podría ser?

raulmt commented 5 years ago

primero tienes que determinar dónde está el problema:

  1. al generar la URL: lo primero que mencionas, usando ctx.router.url, es un path que le estás entregando a la vista, imagino que para hacer render de algún link, cierto? una vez tengas esa vista cargada en el browser, asegúrate de que la URL de ese link es lo que esperas
  2. en el action en donde estás tratando de obtener ctx.params (que puede ser en el path definido para esa acción)

Ahora, por el tipo de argumentos que estás entregando (fromId y toId), estás efectivamente usándolos como path params? Podrías decir cómo es la ruta para crear nuevo mensaje? (el path configurado para la ruta me refiero)

jerosalazar commented 5 years ago

Lo que tengo en las rutas es lo siguiente:

image

image

raulmt commented 5 years ago

El segundo parámetro de ctx.router.url y ctx.params se refieren a path params únicamente (cosas como /ngos/:id). Al menos en tu get de new-message no pareces tener un path param llamado toId, que es lo que estás entregando para generar la ruta en el 1er trozo de código… tienes efectivamente en la ruta un path param llamado así? pues sino no es posible que esto te funcione correctamente. En una de esas lo que estás buscando es entregarlo como query param?

Tienes que tener bien presente que:

  1. una ruta es un path con 0 o más path params entre medio
  2. la generación de rutas permite entregar los reemplazos de estos placeholders, pero como estamos hablando de un path, éstos siempre serán un string. ctx.router.url soporta dos opciones: o le entregas varios argumentos (que espera sean números o strings) y reemplazará cada placeholder en la ruta en el mismo orden, o bien le entregas un objeto, que utilizará para usar cada key del objeto como un reemplazo del placeholder del mismo nombre. Entonces, si le entregas un objeto {toId: 1}, li que buscará es un path param llamado toId y lo reemplazará por 1: /something/:toId/else => /something/1/else
jerosalazar commented 5 years ago

Muchas gracias! Terminé cambiando la ruta messages/:toId/new para que obtenga el párametro del id de esa forma

raulmt commented 5 years ago

pero por si acaso, usar query params tb puede ser válido, y a veces conveniente, si es que el dato no es algo que tenga sentido en el path mismo