Railsで言う所のbefore_saveのようなフィルタは、 Merb(DataMapper)では以下のように使う。

   1  class Post
   2    include DataMapper::Resource
   3  
   4    before :save do
   5      # do some stuff
   6    end
   7  
   8    def foo
   9      puts "foo!"
  10    end
  11  
  12    before :foo, :bar
  13  
  14    def bar
  15      puts "bar!"
  16    end
  17  end

このbeforeメソッドは、ExtLibのhook.rbの中で定義されている。 上記のように、ブロックを取る形式と、イベントをハンドルするメソッド名をシンボルで指定する形式があります。

ExtLibが提供するhookは、saveやvalid?のような特定のイベントだけではなく、全てのメソッドに対して汎用的に利用出来るようです。 ただし、before :foo, :barのように、hookをインストールする時点で、 hookされるメソッド(この場合はfoo)が定義されている必要があります。

クラスメソッドに対するhookも用意されていて、

   1    before_class_method :new do
   2      puts "new!"
   3    end

のように利用出来ます。

Update

beforeフィルターでメソッドの実行を中止する場合は、

   1    before :save do
   2      throw :halt
   3    end

のように、:haltをthrowすればOKです(thanks maiha)。 これは美しい。

posted by Png genki on Tue 30 Dec 2008 at 12:16

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry1168
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ