Hola a todos.
Estoy aprendiendo rails y como primer ejercicio estoy tratando de hacer
un sistema de gestión de usuarios sencillo, login, log out y esas cosas.
Mi primer "gran" problema es el siguiente:
He conseguido que al validar un usuario, si éste está en la base de
datos me diga que he iniciado sesión, pero si: el usuario / pwd no estan
en la base de datos, o no pongo nada en las casillas de user y pwd... me
da el error:
NoMethodError in UsuarioController#login
You have a nil object when you didn't expect it!
The error occurred while evaluating nil.nick
El error se que se está dando porque no recibo nada de la base de datos,
pero no se cómo filtrar que de la bd estoy recibiendo algo. No obstante
¿no deberÃa el modelo impedir que el usuario y la pwd puedan dejarse en
blanco? (en el modelo valido presence_of)
mi código es el siguiente:
def login
@titulo="Inicio de sesion"
if request.post? and params[:usuario] and
@usuario = Usuario.new(params[:usuario])
usuario = Usuario.find_by_nick_and_pwd(@usuario.nick,@usuario.pwd)
if usuario
session[:usuario_id]=usuario.id
flash[:notice] = "Usuario #{usuario.nick} autenticado!"
redirect_to :action => "index"
#render :text => usuario.created_at
else
@usuario.pwd = nil
flash[:notice] = "Usuario #{usuario.nick}, o contraseña no
existen!"
end
end
end
on 2009-06-19 12:05
on 2009-06-19 12:58
2009/6/19 Juanma Uribe <ruby-forum-incoming@andreas-s.net> > Hola a todos. > > Estoy aprendiendo rails y como primer ejercicio estoy tratando de hacer > un sistema de gestión de usuarios sencillo, login, log out y esas cosas. > > Mi primer "gran" problema es el siguiente: > Varias cosas: - Como has dicho, es un ejercicio. Asumo que entiendes, que si fuese para uso real, deberÃas estar encriptando la password y en general haciéndolo todo un poco más robusto. Claro que entonces estarÃas seguramente alguna gema robusta como Authlogic o Clearance ;) - Estás usando estructuras y prácticas bastante obsoletas, como el request.post? para reutilizar la misma acción con dos verbos HTTP distintos, también cosas un poco raras como ese Usuario.new al que recurres sin que sea necesario. Asegúrate de que el material con el que trabajas sea un libro o tutorial actualizado a un Rails 2.0+, como mÃnimo, y que utilice un enfoque REST para los ejemplos y ejercicios. - En tu ejemplo, caes en el else cuando no hay usuario, pero aun asà intentas usar su nick para mostrarlo en el flash, lo cuál te provoca el fallo. Supongo que es en ese punto, porque no pones la traza completa y falta el número de lÃnea del error. El validates_presence_of se encarga de que no se cree o actualice el registro en ausencia de esos campos, pero aquÃ, sin escrituras en base de datos, no está entrando en juego en absoluto. Verifica que entiendes cómo va ese tema. Pero como te digo, más vale que replantees la acción entera. Por cierto, en breve cerraremos el puente entre Ruby Forum y la lista de correo, espero que tu conversación no quede a medias. Revisa un mensaje de ayer para detalles.
on 2009-06-19 13:15
Juanma Uribe wrote: > Hola a todos. > > Estoy aprendiendo rails y como primer ejercicio estoy tratando de hacer > un sistema de gestión de usuarios sencillo, login, log out y esas cosas. Hola Juanma, si, para programar algo medianamente complejo (como han dicho) que salga de los scaffolds básicos necesitarás estudiar, pero no te quedes con rails, trata de estudiar también el lenguaje que está por debajo, ruby, que tiene que sus cositas y te van a hacer muchÃsima falta, al fin y al cabo es el código que escribes. > ... me > da el error: > > NoMethodError in UsuarioController#login > You have a nil object when you didn't expect it! > > The error occurred while evaluating nil.nick > En qué linea te da ese error? Haz probado hacer un debug para saber donde es que fallan las cosas? te recomiendo el siguiente railscast. http://railscasts.com/episodes/54-debugging-with-ruby-debug > ¿no deberÃa el modelo impedir que el usuario y la pwd puedan dejarse en > blanco? (en el modelo valido presence_of) Las validaciones lo único que hacen es no permitir que se guarde un objeto en la base de datos si estas no se cumplen. En el trozo de código que haz enviado no hay ninguna llamada a save, por lo que las validaciones no se llegan a lanzar. En cuanto a la autenticación te aconsejo no quedarte con tu propia versión en producción a no ser que lo hayas probado bien y entendido todas las implicaciones, hay varios ejemplos de implementación en: http://railscasts.com/tags/25 Recursos para estudiar: - El libro "Programming Ruby" Tienes la primera gratis en internet http://www.rubycentral.com/book/ y luego una segunda y tercera que puedes comprar (en pdf o en papel) en http://pragmaticprogrammer.com/titles/ruby/index.html Yo personalmente he comprado la tercera edición (Programming Ruby 1.9) que aunque el nombre dice 1.9 es válido para 1.8 y deja bien claro lo que es de 1.9 y lo que es de 1.8 - El libro "The Rails Way" de Obie Fernandez http://www.amazon.com/Rails-Way-Addison-Wesley-Professional-Ruby/dp/0321445619 - Los railscasts de Ryan Bates (en las url que te he puesto antes) Están realmente buenos. - Blogs escritos hace menos de 6 meses. Y los más antiguos también, pero teniendo en cuenta que te puedes encontrar cosas que ya no son válidas, es lo malo de vivir "on the edge" con un lenguaje y un framework que están en constante desarrollo. - El API de Rails http://api.rubyonrails.org - El código de Rails Uff, esto suena a muy geek, pero en realidad no es tan complejo, está muy bien documentado y si no lo entiendes al menos te quedas como mismo estabas, nunca peor. A mi personalmente me ha servido de mucho. También puedes consultarlo desde el API, cuando veo la documentación de un método en el api, voy al link de source para ver como está implementada. - Más código de aplicaciones hechas en ruby o en rails, en github tienes hasta un code search. Yo por ejemplo me he leido bastante código de los proyectos spree, insoshi, redmine, etc. Y por supuesto, haz bastante pruebas de lo que escribes, no te conformes con ir y probarlo en el navegador. A mi me gusta mucho rspec más que test:unit pero cualquiera de las dos opciones es válida. Vaya si me he enrollao con la respuesta, espero te sirva. Saludos, Jorge
on 2009-06-19 13:23
MuchÃsimas gracias Jorge y Manuel. Como bien habeis supuesto, sólo estoy aprendiendo a manejar básicamente algunas cosillas. No estoy preparando montar ninguna aplicación. TAl y como Manuel me sugerÃa inicialmente el error estaba en el else. No me di cuenta que estaba intentando mostrar el nombre del usuario (que no existÃa... y por tanto no se podÃa mostrar) gran fallo. He visto que el foro cierra y se queda la lista de correo. Tendré que apuntarme :) Sobre lo de los libros/tutoriales/manuales que uso. Ciertamente estaba probando con uno un poquito deprecated, pero no buscaba hacer maravillas, sólo probar y aprender un poco. Tendré muy en cuenta las recomendaciones que me habeis hecho. Gracias a todos, un saludo y hasta la próxima
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.