W trybie rozwój:Called id do zera w Rails 3
nil.id
=> "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"
W trybie produkcyjnym:
nil.id
=> 4
Dlaczego?
W trybie rozwój:Called id do zera w Rails 3
nil.id
=> "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"
W trybie produkcyjnym:
nil.id
=> 4
Dlaczego?
Spójrz na linii, która mówi, że idąc w swoich środowiskach configs:
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true # or false in production.rb
Ma to uniemożliwić wywołanie metody na nil
w trybie rozwoju. Sądzę, że wyłączyli go ze względu na wydajność w produkcji.
I nil
to obiekt singletonowy w ruby, dlatego jego numer id
będzie 4 niezależnie od tego.
Twój development.rb środowiskową ma następującą linię:
config.whiny_nils = true
Które logowania błąd podczas próby wywołania metody na nil
. Identyfikator nil
ma wartość 4, ponieważ it is an object which happens to have an id of 4
Whiny nils są zgłaszane tylko w trybie programowania (zajrzyj do plików konfiguracyjnych).
„płaczliwy Nils” to termin Szyny na umieszczenie ostrzeżenia w dzienniku ilekroć metoda jest wywoływana na wartości zerowej, z (miejmy nadzieję) Pomocna informacji o jakiego rodzaju obiekt może mieć próbuje posługiwać się.
Kod metody NilClass#id
ma dobre wyjaśnienie:
# 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.
Również 'nil.id' == 4, który może być przyczyną niezamierzonych skutków ubocznych –
@phsr dzięki, dodał trochę o singlecie zero –