2017-02-04 65 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)的通常方法調用。在加載類時,它被稱爲一次。這個方法在被調用時設置一個回調函數(第一個參數),在這種情況下,當你的Active Record對象被實例化時被觸發)。

在這種情況下,:if是傳遞給after_initialize方法的關鍵選項。這是一樣的,如果你調用這樣的方法:

after_initialize(:set_default_role, { if: :new_record? }) 
  • 第一個參數:回調方法來調用。
  • 第二個參數:有一些選項的哈希對象。

    剛一說明::if => :new_record?hashrocket符號)相同if: :new_record?的(新的語法,類JSON)。

所以,if這裏只是鍵名稱作爲方法調用(沒有條件if關鍵字)的第二個參數傳遞的選項哈希對象的

順便說一句,您可以閱讀更多關於條件回調here


爲什麼after_initialize :set_default_role if self.new_record?不起作用?

這是因爲該方法被調用的類主體,與類上下文(self = User,不self = @user) - 加載時一次 - 和new_record?實例方法。口譯員會拋出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