Couldn't find objeto without an ID

Hola a todos acabo de empezar en el asombroso mundo de RoR y ya he
tenido el primer problema que no consigo resolver :stuck_out_tongue:

Cuando llamo al método show me salta el siguiente error :

Couldn’t find Receta without an ID

no puede encontrar el objeto Receta sin un id de referencia.

el caso es que en el método si que le indico que busque por el id

def show
@receta = Receta.find(params[:id])
end

Así que me gustaría saber si hay alguna forma de trazar @receta para ver
que
valor toma, porque por lo visto es nulo o no recibe bien el params[:id ]

Gracias de antemano y un saludo a todos los raileros ^^

On Tue, Sep 02, 2008 at 05:09:51PM +0200, carlos gomez wrote:

Cuando llamo al método show me salta el siguiente error :
Couldn’t find Receta without an ID

def show
   @receta = Receta.find(params[:id])
 end

Seguramente no estés llamando al método con ningún parámetro en la URL,
pero de todas formas algunas posibles formas de diagnosticar lo que
está ocurriendo es ver el dump que te hace el mensaje en el navegador y
ver qué estás pasando, o bien usar logger para enviar al log lo que está
pasando. En este caso una
solución sería
def show
logger.info("########### receta/show recibe: #{params.to_json}")
@receta = Receta.find(params[:id])
end

Usar ######### es para que sea más sencillo de ver al mirar el log de
desarrollo (log/development.log).

Pero seguramente el fallo esté en que no le pasas el parámetro correcto.

El 2 de septiembre de 2008 20:25, Pablo Martínez Schroder <
[email protected]> escribió:

está ocurriendo es ver el dump que te hace el mensaje en el navegador y

Pero seguramente el fallo esté en que no le pasas el parámetro correcto.

Hola Pablo gracias por tu respuesta, he conseguido más información con
el
logger pero aun no se exactamente si @receta adquiere algún id, según el
log
esto es lo que ocurre:

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…

Bueno, un saludo a todos y gracias

Bye

El mié, 03-09-2008 a las 09:35 +0200, carlos gomez escribió:

    >        @receta = Receta.find(params[:id])
    lo que está
    log de

Parameters: {“action”=>“show”, “controller”=>“receta”}
Bye

Hola

En el log se ve que le llegan los parametros de controller y action pero
no el id.
El id tendría que ir en la url, tiene pinta de que estás accediendo
a /recetas/show en lugar de a /recetas/show/X
donde X es el ID de la receta que quieres ver, ¿has comprobado eso?

Saludos
Amaia


Amaia C.
Dabne Tecnologías de la Información - www.dabne.net -
http://blog.dabne.net
*
Buscador de Subvenciones - http://buscaboe.dabne.net
Apuntes de Rails - http://apuntesderails.amaiac.net
*

Muchas Gracias a los dos por las respuestas, me están ayudando mucho
pues
como podéis comprobar no tengo los conceptos básicos claros, intento
seguir
manuales pero a la mínima me estanco.
Tengo que cambiar la forma de pensar respecto a php y eso al principio
cuesta un poco :wink:

Bueno ahora ya se el problema que tengo, y por donde tengo que invertir
mis
esfuerzos ^^

Gracias de nuevo y nos leemos por aquí

ciaoo

PD: Si pudieseis pasarme algún manual acerca de como funciona RoR (paso
de
valores entre el modelo, vista, controlador, acceso a bd, etc) me seria
de
gran ayuda, pues me he mirado algunos y tengo un poco de lío entre
versiones
de rails como el uso del scaffold, rake…

El 3 de septiembre de 2008 11:53, Pablo M. Schroder <
[email protected]> escribió:

Aparte del logger puedes debugear, así este tipo de errores “sencillos”
podrías irlos viendo, sobre la marcha, tal como ver el contenido de
params o
si params[:id] tenía algún valor o si un determinado objeto se crea bien
y
demás,

para ello te recomiendo ruby-debug (una búsqueda en google te ayudará a
instalarlo y usarlo), seguro que te ayuda bastante, yo lo prefiero a
usar el
logger, pero sobre gustos colores.

jesús.

2008/9/3 carlos gomez [email protected]

[email protected]> escribió:

Esa línea está invocando el método de clase “find”, que puede recibir
sea 1), ahora intentemos hacer lo que quieres hacer en el show:
le estás pasando a find ningún parámetro, y lanza una excepción de que no

else

Ror-es mailing list


Jesús Navarrete

Independent Developer

Iniciando: http://www.flatee.com

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
:slight_smile: 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 :slight_smile: