5 Stimmen

``` Erscheint id für nil in Rails 3 ```

Im Entwicklungsmodus:

nil.id
=> "Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id"

Im Produktionsmodus:

nil.id
=> 4

Warum?

11voto

Benoit Garret Punkte 13797

Suchen Sie in den Konfigurationen Ihrer Umgebungen nach der Zeile, die Folgendes sagt:

# Fehlermeldungen protokollieren, wenn Sie versehentlich Methoden auf nil aufrufen.
config.whiny_nils = true # oder false in production.rb

Dies dient dazu, zu verhindern, dass Sie in der Entwicklungsphase Methoden auf nil aufrufen. Wahrscheinlich haben sie es in der Produktion aus Leistungsgründen deaktiviert.

Und nil ist ein Singleton-Objekt in Ruby, deshalb ist seine id immer 4, egal was passiert.

2voto

Dan McClain Punkte 11480

Ihre development.rb-Umgebung enthält die folgende Zeile:

 config.whiny_nils = true

Das wird einen Fehler protokollieren, wenn Sie versuchen, eine Methode auf nil aufzurufen. Die id von nil ist 4, weil es sich um ein Objekt handelt, das zufälligerweise die id 4 hat

2voto

Alexander Sulim Punkte 136

Der Code der Methode NilClass#id hat eine gute Erklärung:

# NilClass#id existiert in Ruby 1.8 (obwohl es veraltet ist). Da +id+ eine grundlegende
# Methode der Active Record-Modelle ist, wird NilClass#id ebenfalls neu definiert, um eine RuntimeError
# auszulösen und den Benutzer zu warnen. Wahrscheinlich wollte sie eine Modell-Datenbankkennung und die 4
# die vom Originalverfahren zurückgegeben wurden, könnten zu obskuren Fehlern führen.
#
# Die Einstellung config.whiny_nils bestimmt, ob diese Funktion aktiviert ist.
# Standardmäßig ist es in den Entwicklungs- und Testmodi aktiviert und in der Produktionsumgebung deaktiviert.

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

1voto

Marcel Jackwerth Punkte 51964

Weinernde nils werden nur im Entwicklungsmodus gemeldet (schauen Sie in Ihre Konfigurationsdateien).

"Weinernde nils" ist der Begriff in Rails, der Warnungen in das Protokoll einfügt, wann immer eine Methode auf einen nil-Wert aufgerufen wird, mit (hoffentlich) hilfreichen Informationen darüber, um welche Art von Objekt es sich handeln könnte, das Sie verwenden wollten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X