En el modo de desarrollo:llamado id a cero en los carriles 3
nil.id
=> "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"
En el modo de producción:
nil.id
=> 4
¿Por qué?
En el modo de desarrollo:llamado id a cero en los carriles 3
nil.id
=> "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"
En el modo de producción:
nil.id
=> 4
¿Por qué?
Busque la línea que dice lo siguiente en sus entornos configuraciones:
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true # or false in production.rb
Esto es para evitar que la llamada a métodos de nil
, mientras que en el modo de desarrollo. Supongo que lo desactivaron por motivos de rendimiento en producción.
Y nil
es un objeto singleton en ruby, por eso su id
será 4 sin importar qué.
Su evironment development.rb tiene la línea siguiente:
config.whiny_nils = true
Qué va a registrar un error cuando intenta llamar a un método en nil
. La identificación de nil
es 4 porque it is an object which happens to have an id of 4
Los nils de Whiny solo se informan durante el modo de desarrollo (consulte los archivos de configuración).
"Nils Whiny" es el término rieles para poner advertencias en el registro cada vez que se invoca un método en un valor nulo, con (esperemos) útiles información acerca de qué tipo de objeto que podría haber estado tratando de utilizar.
Código de método NilClass#id
tiene buena explicación:
# NilClass#id exists in Ruby 1.8 (though it is deprecated). Since +id+ is a fundamental
# method of Active Record models NilClass#id is redefined as well to raise a RuntimeError
# and warn the user. She probably wanted a model database identifier and the 4
# returned by the original method could result in obscure bugs.
#
# The flag <tt>config.whiny_nils</tt> determines whether this feature is enabled.
# By default it is on in development and test modes, and it is off in production
# mode.
También, '== nil.id' 4, que puede causar efectos secundarios no deseados –
gracias @phsr, agregó el poco sobre el singleton nil –