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: <h2>
5: <b>Id:</b>
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 Galvan
on 2009-06-23 01:39
on 2009-06-23 02:22
On Jun 22, 2009, at 6:39 PM, Jose Galvan 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
on 2009-06-23 04:43
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 Galvan Jorge Santiago wrote: > On Jun 22, 2009, at 6:39 PM, Jose Galvan 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
on 2009-06-23 13:33
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]
http://nasir.wordpress.com/2007/10/25/full-text-search-using-ferret-acts_as_ferret-with-rails/
[2]
http://kpumuk.info/ror-plugins/using-sphinx-search-engine-in-ruby-on-rails/
[3] http://www.sphinxsearch.com/contribs.html
[4]http://freelancing-god.github.com/ts/en/
El 23 de junio de 2009 04:43, Jose Galvan
<ruby-forum-incoming@andreas-s.net
> escribió:
on 2009-06-23 14:11
On 6/23/09, Jose Galvan <ruby-forum-incoming@andreas-s.net> 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 Galvan 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 > sgilperez@gmail.com blog > http://www.lacoctelera.com/porras now > http://twitter.com/porras
on 2009-06-23 14:12
On 6/23/09, Sergio Gil Pérez de la Manga <sgilperez@gmail.com> 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 :-D -- Sergio Gil Pérez de la Manga e-mail > sgilperez@gmail.com blog > http://www.lacoctelera.com/porras now > http://twitter.com/porras
on 2009-06-23 19:15
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 <sgilperez@gmail.com> 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 :-D > > -- > Sergio Gil P�rez de la Manga > e-mail > sgilperez@gmail.com > blog > http://www.lacoctelera.com/porras > now > http://twitter.com/porras
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.