What have you found for these years?

2008-09-03

method hook for rails...

回覆晚點 ._. 但筆記還是要記 @@

*

剛剛試半天 around_filter, 發現他的行為實在很詭異,
好像是 yield 會當作 action.call, 而沒有 yield 的話,會變成 after_filter.

然而似乎不管怎麼做,都達不到我要的 method hook 的效果,
原因是 yield (action.call) 之後 redirect_to 就失敗,
而 redirect_to 之後 action 又不會被喚起...

所以基本上這些 filter 根本就不能算是 hook. (好吧,名字就不是了... @@)

於是我先找上了 Aspect-Oriented Programming, 先用 aquarium 試試。

試用結果是非常好,完全合乎預期。不過缺點是好像不需要這麼完整的 AOP 支援,
是否有點太殺雞用牛刀?


Aquarium::Aspects::Aspect.new :after,
:methods => ManagementController.public_instance_methods(false) - ['index'],
:for_types => [ManagementController] do |join_point, object|
object.send :redirect_to, :back
end


反正也不需要 around, 單用 after 的話,extlib 也有支援,所以我再試試 extlib.

include Extlib::Hook
(public_instance_methods(false) - ['index']).each{ |action|
after action.to_sym, :redirect_back
}


這樣也是可以用的,沒問題。只是 extlib depend on facets,
而我之前 facets 裡只用了 ergo, 所以把 ergo 直接 copy 至 project 裡。
如果用了 extlib, 那是否就可以把 ergo 移出了?
這樣堅持不用 facets 的意義似乎消失一半了。

不過比較嚴重的問題是,Extlib::Hook 會自己生出一堆 public instance method =_=b
造成的結果就是多了個連結讓你連過來:

management/hookable__photos_rotate_clockwise_nan_before_advised

然而連到這當然會出事啊!!畢竟本來就該是 private 的東西.....

這樣到底該用 extlib 好還是 aquarium 好呢? :(
還是 rails 有什麼方法可以做到真正的 hook?

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0