1

我尝试了以下方法:

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:00(小时:分钟:秒),这应该将条目保存的时间更改为 00:00:01。我知道我的代码很脏(我正在学习 ruby​​、datamapper 等,我有点菜鸟;)),但更糟糕的是:它对模型没有任何影响。它就像我的钩子不存在一样保存。我究竟做错了什么?

(可能也很重要:我将它与 sinatra 一起使用,所以我无法访问诸如 n.hours 等的 Rails 助手!)

提前致谢!;)

4

2 回答 2

2

你为什么用after

我建议使用before以避免对对象的双重操作。

通过 usingself你可以省略多余的entryusing

并且不需要return true

另外,为什么是实例变量?

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
于 2012-11-20T18:26:36.750 回答
0

万一其他人发现了这一点,尽管接受的答案提供了一种解决方法,但关于为什么“after”钩子没有触发的原始​​问题的答案可能是因为“after :save”钩子不会触发,除非调用 save 时模型很脏!

所以;

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

数据映射器的小怪癖,以这种方式做事可以提高性能,但可读性通过地板 IMO。

于 2014-02-07T11:44:59.107 回答