2011-09-26 14 views

Respuesta

11

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

+1

También, '== nil.id' 4, que puede causar efectos secundarios no deseados –

+0

gracias @phsr, agregó el poco sobre el singleton nil –

2

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

1

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.

2

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. 

https://github.com/rails/rails/blob/0c76eb1106dc82bb0e3cc50498383d6f992da4fb/activesupport/lib/active_support/whiny_nil.rb#L19

Cuestiones relacionadas