Mostrando entradas con la etiqueta nil. Mostrar todas las entradas
Mostrando entradas con la etiqueta nil. Mostrar todas las entradas

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