Parameters: {“action”=>“show”, “controller”=>“receta”}
########### receta/show recibe: {“action”: “show”, “controller”: “receta”}
los parámetros si que los toma, el problema puede ser que esos parámetros
estén vacíos, pero entonces ¿porque puede ser? ¿algun problema de mysql?,
¿algun error en la programación?. Seguiré dándole vueltas al asunto…
Creo que el problema viene en comprender cómo funciona todo, y perdona si
lo que explico es demasiado básico, pero prefiero equivocarme pecando de
intentar dejar demasiado claro a dejar algo confundido.
En el código que usas hay varias cosas que creo no comprendes bien.
def show
@receta = Receta.find(params[:id])
end
Esa línea está invocando el método de clase “find”, que puede recibir
varios parámetros. Como quieres llamarlo es pasandole el id del registro
que quieres encontrar.
Para intentar que entiendas mejor, ejecuta la consola usando
script/console.
Receta.find(:first)
Te devolverá la primera receta que encuentra, si no existe devuelve nil.
Supongamos que existe, así que mira el valor del campo id (posiblemente
sea 1), ahora intentemos hacer lo que quieres hacer en el show:
@receta = Receta.find(1)
Verás que en @receta tienes el objecto de clase Receta con id 1, que es lo
que buscabas. Ahora en esa misma consola intenta hacer lo que realmente
estás haciendo.
@receta = Receta.find()
Te dará el mismo error que estás viendo en la página ¿por qué? Porque no
le estás pasando a find ningún parámetro, y lanza una excepción de que no
puede encontrar nada. En tu código estás haciendo
"Receta.find(params[:id]) y si te fijas en la salida del log,
params[:id]
no está definido, con lo que lo que estás ejecutando es “Receta.find()”
que ya hemos visto que es el fallo.
Ya sabemos cuál es el problema, ahora hay que buscar la solución y para
ello lo que tenemos que hacer es que params[:id] tenga el valor del
registro que estamos buscando. Una forma de hacerlo sería añadir ?id=1 a
la URL, pero en Rails existen los mecanismos de rutas y por defecto el
campo id forma parte de la URL con lo que la URL podría ser de la forma
http://localhost:3000/receta/show/1
Seguramente estás intentando mirar receta/show/ sin añadir el campo. Si
quieres, una chapuza que te ayudará a entender lo que está pasando es que
re-escribas el método como
def show
if params[:id].nil? then
render :text => ‘No has especificado que receta quieres ver’
return
else
@receta = Receta.find(params[:id])
end
end
Este código que te he puesto no pasará a la historia como elegante, ni
práctico, el objetivo es solamente intentar aclarar qué está pasando en tu
sistema. Una vez que lo tengas más claro, tocará mirar las excepciones
para que tu aplicación sepa reaccionar mejor a ese tipo de problemas, y
después ya intentar aplicar la filosofía DRY a la gestión de excepciones
Pero antes empecemos por entender este peñazo de mail.
Un saludo, y espero que te haya podido servir.
–
Pablo M. Schroder
http://docecosas.com
PD: Si alguien va a responder este mensaje citandolo, sería interesante
que se cite sólo la parte relevante en vez de dejar toooodo el tocho,
cosas de netiqueta y demás