Problema al intentar validar un usuario desde la bd

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

2009/6/19 Juanma U. [email protected]

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

  • 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.

Juanma U. 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.

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

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

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 F.

http://www.amazon.com/Rails-Way-Addison-Wesley-Professional-Ruby/dp/0321445619

  • Los railscasts de Ryan B. (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

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

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