Dies geschieht aufgrund von Scoping. Wenn Sie in einer Methode, und Sie versuchen, setzen Sie eine neue Variable wie folgt aus :
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
end
end
Sie erstellen eine brandneue Variable, die sich in set_active_flag befindet. Sobald die Ausführung abgeschlossen ist, verschwindet sie und ändert sich self.active_flag
in keiner Weise (die eigentliche Instanzvariable).
JEDOCH (dies war eine Quelle der Verwirrung für mich): Wenn Sie versuchen, eine Instanzvariable in Ruby wie folgt zu lesen :
class SomeData < ActiveRecord::Base
def whats_my_active_flag
puts active_flag
end
end
Sie erhalten tatsächlich self.active_flag
(die eigentliche Instanzvariable) zurückgegeben.
Hier ist der Grund:
Ruby wird alles tun, um eine Rückkehr zu vermeiden nil
.
- Zunächst wird gefragt, ob
active_flag
es im Rahmen von whats_my_active_flag
?
- Es sucht und erkennt die Antwort „nein“, so springt er auf eine Ebene, auf die Instanz von some
- Es fragt noch einmal dasselbe: "Existiert
active_flag
es in diesem Bereich?
- Die Antwort ist "yup" und so heißt es "Ich habe etwas für dich" und es gibt das zurück!
Wenn Sie jedoch active_flag
innerhalb von definieren whats_my_active_flag
und dann danach fragen, werden die folgenden Schritte erneut ausgeführt:
- Es fragt "
active_flag
existiert im Rahmen von whats_my_active_flag
?
- Die Antwort lautet "yup", daher wird dieser Wert zurückgegeben
In beiden Fällen wird der Wert von nicht geändert , es self.active_flag
sei denn, Sie teilen dies ausdrücklich mit.
Eine einfache Möglichkeit, dieses Verhalten zu beschreiben, besteht darin, "Sie nicht enttäuschen zu wollen" und zurückzukehren. nil
Daher bemüht es sich, alles zu finden, was es kann.
Gleichzeitig "möchte es keine Daten durcheinander bringen, die Sie nicht ändern wollten", sodass die Instanzvariable selbst nicht geändert wird.
Hoffe das hilft!