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(hours:min:sec)の場合、エントリが保存された時刻が00:00:01に変更されます。私は自分のコードが汚れていることを知っています(私はruby、datamapperなどを学んでいます、私は少し初心者です;))、しかしさらに悪いことに、それはモデルに何の影響も与えません。フックが存在しないかのように保存されます。私は何が間違っているのですか?

(おそらく重要なこと:私はこれをsinatraで使用しているので、n.hoursなどのrailsヘルパーにアクセスできません!)

前もって感謝します!;)

4

2 に答える 2

2

なぜ使っているのafter

beforeオブジェクトの二重操作を避けるために使用することをお勧めします。

を使用selfすることにより、冗長なentry使用を省略できます

する必要はありません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」フックが起動しないという事実によるものです。保存を呼び出すとモデルがダーティになります。

それで;

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

datamapperのちょっとした癖ですが、この方法でパフォーマンスを向上させることができますが、読みやすさはフロアIMOを通過します。

于 2014-02-07T11:44:59.107 に答える