Error: Called id for nil, which would mistakenly be 4 -- if

Hola a todos,

Estoy haciendo un ejercicio con una tabla llamada alumnos cuyo modelo
tiene los campos:

id, ap_pat, ap_mat, nombre, etc… , el ‘id’ es la llave primaria y
segun veo rails hace las busquedas por esta llave sin ningun problema,
mi ejercicio consiste ahora en buscar un registro en la tabla en base al
apellido paterno (ap_pat) asi que para este efecto decidi hacer dos
cosas:

1- Denifi dentro de mi clase ‘alumnos’ un nuevo metodo
‘encuentra_alumno’ como sigue:

def encuentra_alumno

@alumno = Alumno.find(:first, :conditions => [ “ap_pat = ?”,
params[:ap_pat]])
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @alumno }
end
end

este metodo es exactamente el mismo que el metodo ‘show’ definido por
rails, solo que antes la busqueda era por ‘id’ definida asi:

@alumno = Alumno.find(params[:id])

yo la modifique a:

@alumno = Alumno.find(:first, :conditions => [ “ap_pat = ?”,
params[:ap_pat]])

2- En la carpeta ‘Views’ saque una copia de la vista ‘show.html.erb’ y
la renombre como ‘encuentra_alumno.html.erb’, asi de esta manera la
accion ‘encuentra_alumno’ tendria su correpondiente vista.

En el navegador ingreso:

http://localhost:3000/alumnos/encuentra_alumno/Galvan

donde ‘Galvan’ es el apellido del alumno que deseo buscar y me arroja lo
siguiente:

RuntimeError in Alumnos#encuentra_alumno

Showing app/views/alumnos/encuentra_alumno.html.erb where line #7
raised:

Called id for nil, which would mistakenly be 4 – if you really wanted
the id of nil, use object_id

Extracted source (around line #7):

4:


5: Id:
6:
7: <%=h @alumno.id %>
8:
9: <%=h @alumno.ap_pat %>
10:

Alguno de Uds ha experminentado este error ?, apreciare cualquier
comentario, ayuda, sugerencia…

Gracias.

Jose G.

On Jun 22, 2009, at 6:39 PM, Jose G. wrote:

def encuentra_alumno

@alumno = Alumno.find(:first, :conditions => [ “ap_pat = ?”,
params[:ap_pat]])
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @alumno }
end
end

Aunque está correcto, podrías hacer el find más conciso:

@alumno = Alumno.find_by_ap_pat(params[:ap_pat])

8:
9: <%=h @alumno.ap_pat %>
10:

Al parecer en la vista no estás controlando el caso en que @alumno sea
nulo, y el error salta porque el find no encuentra el registro que
buscas y @alumno toma el valor nulo y luego intentas mostrar
propiedades de este objeto.

Se me ocurre que la razón por la cual no te está encontrando el
registro (suponiendo que si está en la BD) es porque el parámetro
“Galvan” está llegándote a través de params[:id] y no en el
params[:ap_pat], para lo cual hubieras tenido que modificar el archivo
routes.rb.

Prueba modificando el find del método encuentra_alumno
así:
@alumno = Alumno.find_by_ap_pat(params[:id])

Saludos,


jorge santiago

Jorge,

Efectivamente, tu observacion fue acertada, muchas gracias, bueno, estoy
apenas entendiendo rails y haciendo mis primeros ejercicios y gracias al
apoyo de gentes como tu el camino para los principiantes se hace menos
espinoso…gracias nuevamente.

Jose G.

Jorge S. wrote:

On Jun 22, 2009, at 6:39 PM, Jose G. wrote:

def encuentra_alumno

@alumno = Alumno.find(:first, :conditions => [ “ap_pat = ?”,
params[:ap_pat]])
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @alumno }
end
end

Aunque est� correcto, podr�as hacer el find m�s conciso:

@alumno = Alumno.find_by_ap_pat(params[:ap_pat])

8:
9: <%=h @alumno.ap_pat %>
10:

Al parecer en la vista no est�s controlando el caso en que @alumno sea
nulo, y el error salta porque el find no encuentra el registro que
buscas y @alumno toma el valor nulo y luego intentas mostrar
propiedades de este objeto.

Se me ocurre que la raz�n por la cual no te est� encontrando el
registro (suponiendo que si est� en la BD) es porque el par�metro
“Galvan” est� lleg�ndote a trav�s de params[:id] y no en el
params[:ap_pat], para lo cual hubieras tenido que modificar el archivo
routes.rb.

Prueba modificando el find del m�todo encuentra_alumno
as�:
@alumno = Alumno.find_by_ap_pat(params[:id])

Saludos,


jorge santiago

Yo tengo poca idea. Pero para temas de busquedas. Creo que ya hay cosas
potentes programadas por otros. Yo optaría por buscar en google, ver las
opciones que encuentras, volver a la lista, contarnoslas. Y que la gente
que
sabe te diga cual es la que cree que mejor va.

Por mi parte, aqui te dejo dos:

El primero [1] es Ferret. Que creo fue más popular antes. Creo que ahora
es
más popular Sphinx [3] (opinión-creencia mia. Que no tengo ni
put…idea)
En el link [2] te pongo un articulo en el que hablan de Sphinx. Y en el
[4]
Un plugin para gestionar Sphinx desde una App Rails (creo)

Espero que te sirva.

Un saludo

[1]

[2]

[3] http://www.sphinxsearch.com/contribs.html
[4]http://freelancing-god.github.com/ts/en/

El 23 de junio de 2009 04:43, Jose G.
<[email protected]

escribió:

On 6/23/09, Jose G. [email protected] wrote:

end
@alumno = Alumno.find(:first, :conditions => [ “ap_pat = ?”,
http://localhost:3000/alumnos/encuentra_alumno/Galvan
the id of nil, use object_id

Alguno de Uds ha experminentado este error ?, apreciare cualquier
comentario, ayuda, sugerencia…

Gracias.

Jose G.

He leído tu correo un poco rápido pero no me ha parecido ver que hayas
modificado ninguna ruta. Por tanto, en esa petición params[:id] =
‘Galvan’ y params[:ap_pat] no es nada (que Rails no es adivino!!).

Te recomiendo que leas en algún manual introductorio cómo Rails
convierte URLs en conjuntos de parámetros usando las rutas, es un
sistema sencillo a la vez que potente, pero no mágico!!


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

Andres y Sergio,

Gracias por leer mi correo y orientarme, si, efectivamente me hace falta
documentarme mas con respecto a herramientas de busqueda alternativas, y
bueno, dentro del mismo rails, estoy aprendiendo apentas, esto de las
rutas, como muchos otros aspectos de rails aun no lo entiendo bien
hechare manos a la obra ahora mismo…

Saludos !

Sergio Gil Pérez de la Manga wrote:

On 6/23/09, Sergio Gil P�rez de la Manga [email protected] wrote:

He le�do tu correo un poco r�pido pero no me ha parecido ver que hayas
modificado ninguna ruta. Por tanto, en esa petici�n params[:id] =
‘Galvan’ y params[:ap_pat] no es nada (que Rails no es adivino!!).

Te recomiendo que leas en alg�n manual introductorio c�mo Rails
convierte URLs en conjuntos de par�metros usando las rutas, es un
sistema sencillo a la vez que potente, pero no m�gico!!

Ello sin perjuicio de que como te han dicho m�s arriba no
est�smanejando el caso en que no se encuentra el alumno, cosa que deber�as
hacer para dar el feedback correcto al usuario. S�lo que como
adem�sest�s haciendo mal la b�squeda, eso te pasa siempre :smiley:


Sergio Gil P�rez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras

On 6/23/09, Sergio Gil Pérez de la Manga [email protected] wrote:

He leído tu correo un poco rápido pero no me ha parecido ver que hayas
modificado ninguna ruta. Por tanto, en esa petición params[:id] =
‘Galvan’ y params[:ap_pat] no es nada (que Rails no es adivino!!).

Te recomiendo que leas en algún manual introductorio cómo Rails
convierte URLs en conjuntos de parámetros usando las rutas, es un
sistema sencillo a la vez que potente, pero no mágico!!

Ello sin perjuicio de que como te han dicho más arriba no
estásmanejando el caso en que no se encuentra el alumno, cosa que deberías
hacer para dar el feedback correcto al usuario. Sólo que como
ademásestás haciendo mal la búsqueda, eso te pasa siempre :smiley:


Sergio Gil Pérez de la Manga
e-mail > [email protected]
blog > http://www.lacoctelera.com/porras
now > http://twitter.com/porras