2010-03-12 78 views
4

我需要修復ActiveRecord屬性的編碼,並決定在before_save鉤子中執行此操作。在這一點上,我注意到一個意想不到的功能。當我想要更改屬性的值時,使用attribute_name=XY的簡單操作無法按預期工作。而不是我需要使用self[:attribute_name]=XY。到目前爲止,沒有認識到這種行爲,我用AR.attribute_name=XY。這是什麼原因?這種行爲是否與鉤子或其他東西有關?感謝您的解釋。更改before_save鉤子中的ActiveRecord屬性值

回答

8

這其實是一個Ruby的 「功能」:

def value=(x) 
    p x 
end 

def run 
    value = 123 
end 

run 
# => 123 

在#run以上,這樣做值分配本地變量,而不是別的。如果你想打電話#值=,你必須指定接收器:

def run 
    self.value = 123 
end 

run 
123 
# => nil 

希望這有助於!

+0

也許一個ActiveRecord類的例子會更好嗎? – danielricecodes 2014-04-06 13:34:24

+0

@phonk64問題出在Rails應用程序的上下文中,但錯誤是純Ruby的。添加Rails或ActiveRecord的上下文不會添加任何重要的新知識。 – 2014-04-07 15:04:33