router.param('quizId', quizController.load);
router.param('quizId/claveinvitado', invitadoController.load);
Cómo es posible que una petición sin claveinvitado dispare el invitadoController.load si no lleva ese parámetro en la petición GET?
Esta petición:
/quizes/<%= quizes[i].id %>/edit
dispara invitadoController en vez de quizController que es donde está el recurso /edit. Esto no deberÃa pasar porque como decÃa, no lleva claveinvitado. Lo que termina haciendo es mostrar en vez de editar.
En esta otra:
Código:
/quizes/<%= quiz.id %>/<%= quiz.claveinvitado
sà tiene sentido que dispare invitadoController. Bien.
La pregunta es si es posible que las rutas
Código:
router.param('quizId', quizController.load);
router.param('quizId/claveinvitado', invitadoController.load);
definidas en el enrutador se molesten aun siendo diferentes.
Hombre compañero Antonio, me alegra verte por aquÃ. Asà es, le puedo dar una buena utilidad para la gestión de varios hoteles. A la gente le cuesta mucho documentar incidencias, y son una buena herramienta para las negociaciones.
Eso que comentas ya lo he probado y la app se comporta mucho peor. Es como si confundiese los autoload del quiz
e invitado. Por ejemplo cuando intento crear un parte me dice que no encuentra el id en invitadoController.
Este es el autoload de invitadoController:
exports.load = function(req, res, next, claveinvitado) {
models.Quiz.find({
where: {claveinvitado: claveinvitado},
include: [{model: models.Comment}]
}).then(function(quiz) {
if (quiz) {
req.quiz = quiz;
next();
} else {
next(new Error('No existe quizId=' + quiz[id]));
}
}
).catch(function(error) {next(error);});
};
El link que le mando al proveedor en un email está en /quizes/show: https://incipro.herokuapp.com/quizes/quiz.claveinvitado
Si no es mucho pedir, te agradecerÃa lo revises a ver si ves una solución para esto. La idea es mandar el link para que el destinatario solo vea esa claveinvitado.
Eso es lo que confunde, pensaba que al tener parámetros diferentes cada GET irÃa a un controller diferente.
Tengo estos parámetros:
router.param('quizId', quizController.load);
router.param('claveinvitado',invitadoController.load);
Y estos enrutadores:
router.get('/quizes/:quizId(\\d+)', sessionController.loginRequired, quizController.show);
router.get('/quizes/:claveinvitado', invitadoController.show);
Buenas, estoy haciendo un proyecto para gestión de incidencias con proveedores. El gestor que genera la incidencia ha de enviar un link al proveedor que le dé acceso a un recurso concreto. Para esto he separado las rutas asi:
router.param('quizId', quizController.load);
router.param('quizId/claveinvitado', invitadoController.load);
Cómo es posible que una petición sin claveinvitado dispare el invitadoController.load si no lleva ese parámetro en la petición GET?
Esta petición:
/quizes/<%= quizes[i].id %>/edit
dispara invitadoController en vez de quizController que es donde está el recurso /edit. Esto no deberÃa pasar porque como decÃa, no lleva claveinvitado. Lo que termina haciendo es mostrar en vez de editar.
En esta otra:
Código:
/quizes/<%= quiz.id %>/<%= quiz.claveinvitado
sà tiene sentido que dispare invitadoController. Bien.
La pregunta es si es posible que las rutas
Código:
router.param('quizId', quizController.load);
router.param('quizId/claveinvitado', invitadoController.load);
definidas en el enrutador se molesten aun siendo diferentes.
Gracias por los comentarios.
22/09/2015 15:04
router.param('claveinvitado', invitadoController.load);
Y definir los enrutadores como:
router.get('/quizes/:claveinvitado', [middleware]);
Off-topic: ¿Sacando partido al curso de MiriadaX? ;)
22/09/2015 16:36
Eso que comentas ya lo he probado y la app se comporta mucho peor. Es como si confundiese los autoload del quiz
e invitado. Por ejemplo cuando intento crear un parte me dice que no encuentra el id en invitadoController.
Este es el autoload de invitadoController:
exports.load = function(req, res, next, claveinvitado) {
models.Quiz.find({
where: {claveinvitado: claveinvitado},
include: [{model: models.Comment}]
}).then(function(quiz) {
if (quiz) {
req.quiz = quiz;
next();
} else {
next(new Error('No existe quizId=' + quiz[id]));
}
}
).catch(function(error) {next(error);});
};
claveinvitado la genero en quizes/create asi:
var quiz = models.Quiz.build( req.body.quiz );
quiz.claveinvitado = Math.random();
Es rudimentario, pero solo es para probar. No sé si esto es lo que hace que se confundan los autoloads.
El link que le mando al proveedor en un email está en /quizes/show: https://incipro.herokuapp.com/quizes/quiz.claveinvitado
Si no es mucho pedir, te agradecerÃa lo revises a ver si ves una solución para esto. La idea es mandar el link para que el destinatario solo vea esa claveinvitado.
Gracias Antonio.
22/09/2015 20:01
Tu le mandas al cliente algo asÃ:
https://incipro.herokuapp.com/quizes/xxx
Siendo XXX la quiz.claveinvitado.
Entonces en el enrutador has tenido que definir la ruta de la siguiente manera.
router.get('/quizes/:claveinvitado', ....);
Si lo haces asÃ, y tu único path es ese, puede usar:
router.param('claveinvitado', ...);
y no tendrÃas que tener problemas.
¿No tendrás definido dos veces el mismo path una vez con "/quizes/:QuizId" y otra con '/quizes/:claveinvitado"?
Si fuera asÃ, tendrÃas que cambiar la ruta de uno de ellos.
22/09/2015 20:14
Eso es lo que confunde, pensaba que al tener parámetros diferentes cada GET irÃa a un controller diferente.
Tengo estos parámetros:
router.param('quizId', quizController.load);
router.param('claveinvitado',invitadoController.load);
Y estos enrutadores:
router.get('/quizes/:quizId(\\d+)', sessionController.loginRequired, quizController.show);
router.get('/quizes/:claveinvitado', invitadoController.show);
Pensaba que se dispararÃan los controladores dependiendo de qué parámetro llevase la ruta, y por lo que me dices ya veo que no es asÃ.
Cómo lo podrÃa resolver? Si lo consigo voy a poder implantar en la empresa una herramienta muy útil.
Te agradezco la ayuda.
22/09/2015 20:27
Yo lo solucionarÃa, por ejemplo:
router.get('/quizes/:claveinvitado/response', invitadoController.show);
Es decir, creando una ruta para las quizes y otra para los invitados (incluso podrÃas reutilizar el controlador, aunque no es tu caso).
Recuerdas que con router estás definiendo un URI, no puedes repetirlo.
22/09/2015 23:05
Perfecto, ahora sà funciona.
SÃ podrÃa haber usado el mismo quizController haciendo un export.showinvitado =... De momento lo dejo asÃ.
Bueno, mil gracias Antonio.