2017-02-04 12 views
0

enter image description here説明after_initializeかの構文


更新:画像のタイプミス):

after_initialize :set_default_role, :if => :new_record? 
上記のコード与え

だから、私は興味名があります:if => :new_record?構文?

ifステートメントがハッシュとして書かれているのはなぜですか?そのように書か場合

差があります:すべての

after_initialize :set_default_role if self.new_record? 

答えて

1

まず、after_initialize構文は、あなたのコード内の間違っです。

の代わりに:

after_initialize: set_default_role

あなたは

after_initialize :set_default_roleを呼び出す必要があります。言っ


after_initializeはここでクラス本体(はい、それはRubyで可能です)から通常のメソッド呼び出しです。クラスがロードされたときにはと呼ばれます。このメソッドを呼び出すと、アクティブレコードオブジェクトがインスタンス化されたときに呼び出されるコールバック(最初のパラメータ)がトリガーされます。

この場合、:ifafter_initializeメソッドに渡される重要なオプションです。あなたはこのようなメソッドを呼び出したかのように、それは同じです:

after_initialize(:set_default_role, { if: :new_record? }) 
  • 最初のパラメータ:コールバックメソッドを呼び出すために。
  • 第2パラメータ:いくつかのオプションがあります。

    ジャストノート::if => :new_record?hashrocket表記)がif: :new_record?新しい構文、JSONのような)と同じです。

だから、ここifはメソッド呼び出し(ない条件ifキーワード)の第2引数として渡されたオプションはハッシュオブジェクトのちょうどキー名です。

ところで、あなたは条件付きコールバック について詳しく読むことができます。


なぜafter_initialize :set_default_role if self.new_record?が機能しないのですか?ロードされたときに一度 - - 、およびnew_record?インスタンスメソッドで、このメソッドは、クラスのコンテキスト(self = User、ないself = @user)で、クラス本体に呼び出されるためです

。通訳者はundefined method 'new_record?'エラーを投げます。

if:キーを正しく:new_record?に設定すると、ポインタのように機能します。 私は今クラスのコンテキストで、時間が来ると(このアクティブレコードオブジェクトがインスタンス化される)、今度はクラスset_default_roleというメソッドを探しますインスタンスメソッドnew_record?trueを返した場合。

+0

ありがとうございました。 ':if'キーオプション**は、' after_initialize'のようにそれらを扱う特定のメソッドに対してのみ**有効です**すべてのRubyメソッドが継承するものですか? – resting

+0

@restingよろしくお願いします。すべての[コールバックメソッド](http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks)のオプションです。 – mrlew