jueves, 11 de diciembre de 2008

Curioso comportamiento de nil.id

En un trozo de código similar a este:

user_id = User.find_by_email(email).id rescue nil
if user_id.nil?
....


Me he vuelto a encontrar otra vez con un curioso comportamiento. En desarrollo funciona bien, pero en producción devuelve un user_id incorrecto en lugar de un nulo cuando el usuario no existe.

Es debido la forma de acceder del objeto nil a su atributo id. En modo desarrollo devuelve una excepción, pero en cambio en modo producción, sólo da un warning

$ ruby script/console
Loading development environment (Rails 2.1.2)
>> nil.id
RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
from (irb):1
>> exit
$ ruby script/console production
Loading production environment (Rails 2.1.2)
>> nil.id
(irb):1: warning: Object#id will be deprecated; use Object#object_id
=> 4


La solución es muy simple, o acceder al objeto a traves de []

user_id = User.find_by_email(email)[:id] rescue nil
if user_id.nil?
....


o acceder al id despues de comprobar el nil

user = User.find_by_email(email)
if user.nil?

Es algo trivial, pero a ver si escribiéndolo no me vuelve a pasar... :-p

No hay comentarios:

Publicar un comentario