(更新:画像のタイプミス):
after_initialize :set_default_role, :if => :new_record?
上記のコード与え
だから、私は興味名があります:if => :new_record?
構文?
if
ステートメントがハッシュとして書かれているのはなぜですか?そのように書か場合
差があります:すべての
after_initialize :set_default_role if self.new_record?
(更新:画像のタイプミス):
after_initialize :set_default_role, :if => :new_record?
上記のコード与え
だから、私は興味名があります:if => :new_record?
構文?
if
ステートメントがハッシュとして書かれているのはなぜですか?そのように書か場合
差があります:すべての
after_initialize :set_default_role if self.new_record?
まず、after_initialize
構文は、あなたのコード内の間違っです。
の代わりに:
after_initialize: set_default_role
、
あなたは
after_initialize :set_default_role
を呼び出す必要があります。言っ
、after_initialize
はここでクラス本体(はい、それはRubyで可能です)から通常のメソッド呼び出しです。クラスがロードされたときには、と呼ばれます。このメソッドを呼び出すと、アクティブレコードオブジェクトがインスタンス化されたときに呼び出されるコールバック(最初のパラメータ)がトリガーされます。
この場合、:if
はafter_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
を返した場合。
ありがとうございました。 ':if'キーオプション**は、' after_initialize'のようにそれらを扱う特定のメソッドに対してのみ**有効です**すべてのRubyメソッドが継承するものですか? – resting
@restingよろしくお願いします。すべての[コールバックメソッド](http://guides.rubyonrails.org/active_record_callbacks.html#conditional-callbacks)のオプションです。 – mrlew