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