30th
Tue
Merbのfilterについて
Railsで言う所のbefore_sav
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
genki
on Tue 30 Dec 2008
at 12:16