2017-02-04 2 views
0

enter image description hereErklären after_initialize wenn Syntax


(Update: Tippfehler in Bild):

after_initialize :set_default_role, :if => :new_record? 

So ist der obige Code gegeben, ich bin neugierig ist es ein Name für die :if => :new_record? Syntax?

Warum wird die if-Anweisung als Hash geschrieben?

Gibt es einen Unterschied, wenn sein geschrieben als:

after_initialize :set_default_role if self.new_record? 

Antwort

1

Vor allem die after_initialize Syntax ist falsche in Ihrem Code.

Statt:

after_initialize: set_default_role,

sollten Sie

after_initialize :set_default_role nennen.


Das heißt, ist after_initialize hier ein normaler Methodenaufruf aus der Klasse Körper (ja, es ist möglich in Ruby). Es heißt einmal, wenn die Klasse geladen ist. Wenn diese Methode aufgerufen wird, wird ein Rückruf (erster Parameter) festgelegt, der in diesem Fall ausgelöst wird, wenn Ihr Active Record-Objekt instanziiert wird.

In diesem Fall ist :if eine Schlüsseloption an die after_initialize Methode übergeben. Es ist das gleiche, als wenn Sie die Methode wie folgt Aufruf wurden:

after_initialize(:set_default_role, { if: :new_record? }) 
  • Erster Parameter: die Callback-Methode aufzurufen.
  • Zweiter Parameter: Hash-Objekt mit einigen Optionen.

    Nur ein Hinweis: :if => :new_record? (hashrocket Notation) ist das gleiche von if: :new_record? (neue Syntax, JSON-like).

So if hier sind nur die Schlüsselnamen des Hash-Optionen Objekts als zweites Argument des Methodenaufrufes übergibt (nicht das bedingte if Schlüsselwort).

Übrigens können Sie mehr über Bedingte Rückrufehere lesen.


Warum after_initialize :set_default_role if self.new_record? wird nicht funktionieren?

Das ist, weil diese Methode in der Klasse Körper, mit dem Klassen-Kontext genannt wird (self = User, nicht self = @user) - einmal beim Laden - und new_record? ist eine Instanz-Methode. Der Interpreter würde einen undefined method 'new_record?' Fehler werfen.

Wenn Sie if: Schlüssel zu :new_record? richtig einstellen, funktioniert es wie ein Zeiger. Sie sagen: ok, ich definiere jetzt, in meinem Klassenkontext, wenn die Zeit kommt (dieses Active Record Objekt wird instanziiert), werden Sie nach einer Methode namens set_default_role in meiner Klasse Instanz suchen, aber nur Wenn die Instanz Methode new_record?true zurückgibt.

+0

Danke. Also ist ': if' Schlüsseloption ** nur ** gültig für bestimmte Methoden, die sie behandeln wie' after_initialize', oder ist es etwas, das alle Ruby-Methoden erben? – resting

+0

@Resting du bist willkommen. Es ist eine Option für alle [Callback-Methoden] (http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks) ... – mrlew

Verwandte Themen