2010-04-07 65 views
4

我無法在after_create回調中訪問我的模型的屬性...似乎我應該能夠正確嗎?Rails after_create回調無法訪問模型的屬性

控制器:

@dog = Dog.new(:color => 'brown', :gender => 'male') 
@dog.user_id = current_user.id 
@dog.save 

型號:

class Dog < ActiveRecord::Base 
    def after_create 
    logger.debug "[DOG CREATED] color:#{color} gender:#{gender} user:#{user_id}" 
    end 
end 

控制檯:(一切似乎都很好)

>>Dog.last 
=>#<Dog id: 1, color: "brown", gender: "male", user_id: 1> 

日誌:(WTF!?)

... 
[DOG CREATED] color: gender:male user 
... 

我的一些屬性顯示出來,而其他的則不顯示!不好了!任何人都知道我在做什麼錯了?過去,我一直能夠以這種方式使用after_create。

注:我使用的實際變量名稱和值是不同的,但方法和代碼是相同的。

+1

這是非常mithtic。在你的模型 – fl00r 2010-04-07 16:32:06

+0

中看起來有點不對,在日誌中嘗試使用self.color,self.gender,self.user_id。 – 2010-04-07 17:00:54

+0

@ vlad.zloteanu ...是的,我做了...同樣的事情發生了 – tybro0103 2010-04-07 18:05:09

回答

4

想通了我自己的問題。

其中一個屬性是虛擬的,其中我使用了self.update_attribute ... oops!

def price=(amt) 
    self.update_attribute(:price_in_cents, (amt*100.0).to_i) 
end 

所以備案,update_attribute將實際創建數據庫記錄(以及觸發after_create)如果尚未創建它。

下一次我一定會發布完整的代碼!

+0

正確的是,當調用after_create時,所有的attr_accessors已經被設置(並且可以被清除)。 – 2012-07-31 06:36:05

0

試試這個:

class Dog < ActiveRecord::Base 
    def after_create(dog) 
    logger.debug "[DOG CREATED] color:#{dog.color} gender:#{dog.gender} user:#{dog.user_id}" 
    end 
end 
+0

這就是我在觀察者中所做的。 – 2010-04-07 17:05:55

+0

你如何將一個變量傳遞給after_create? – tybro0103 2010-04-07 18:04:37

0

嘗試使用after_save的,而不是after_create可能是工作。沒有經過測試。

after_create()在Base.save之後,尚未保存的新對象(不存在任何記錄)被調用。請注意,此回調仍然包含在保存的事務中。例如,如果您在此時調用外部索引器,它將不會看到數據庫中的更改。

0

宏樣式回調可能是一個比單純覆蓋該方法更好的主意。它可以讓你在生命週期中同時觸發幾種不同的方法(如果你想的話)。我認爲你需要的是:

class Dog < ActiveRecord::Base 
    after_create :dog_logger 

    def dog_logger 
     logger.debug "[DOG CREATED] color:#{self.color} gender:#{self.gender} user:#{self.user_id}" 
    end 
end 
+0

是的,我也喜歡這種方法,但它不會影響我的問題。 – tybro0103 2010-04-09 14:51:51