2012-11-20 37 views
1

我試過如下:如何正確使用datamapper回調(或掛鉤)?

class DataEntry 
    include DataMapper::Resource 
    property :id,   Serial, :key => true 
    property :some_data, Text, :length => 1000000 
    property :created_at, DateTime 

    after :save do |entry| 
    if entry.created_at.strftime('%T') == "00:00:00" 
     @new_datetime = ((entry.created_at.to_time+1)-3600).to_datetime 
     entry.update!(:created_at => @new_datetime) 
    end 
    return true 
    end 
end 

這應該更改的條目已保存到00:00:01,如果是00:00:00的時間(小時:分鐘:秒)。我知道我的代碼很髒(我正在學習ruby,datamapper等,我是一個小白鼠;)),但更糟糕的是:它對模型沒有任何影響。它只是保存好像我的鉤子不存在。我究竟做錯了什麼?

(這是什麼,也許也很重要:我用這與西納特拉,所以我不能進入軌道傭工像n.hours等!)

提前感謝! ;)

回答

2

你爲什麼用after

我建議使用before來避免對象的雙重操作。

使用self您可以使用

,無需return true

也,爲什麼實例變量entry省略多餘?

before :save do 
    if self.created_at.strftime('%T') == "00:00:00" 
    self.created_at = ((self.created_at.to_time+1)-3600).to_datetime 
    end 
end 
+0

哈哈是的,它的工作原理! –

0

如果任何人發現這一點,雖然接受的答案提供了一個解決辦法,回答有關爲什麼「之後的」勾並沒有射擊原來的問題可能是由於一個事實,即「後:保存「鉤子將不會啓動,除非保存被調用時模型變髒!

所以;

m = MyModel.first 
m.save #Hook will not fire 
m.name = "Foo" 
m.save #Hook will fire 

datamapper的小怪癖,你可以通過這種方式做事情來提高性能,但可讀性通過地板IMO。