顯示具有 cache_fu 標籤的文章。 顯示所有文章
顯示具有 cache_fu 標籤的文章。 顯示所有文章

2007/6/29

cache_fu, memcached, 與 Locomotive 的問題

近兩個星期開始替專案中大大小小的部份加上 memcached 的支援,配合了 cache_fu 這個方便的 Rails plugin,寫起來順利不少。但在 Mac 上執行起來倒是碰到一個問題。由於使用 Mac,最方便的 Rails 懶人安裝包,便是使用 Locomotive,以及它內附的一大票 rubygems。但我們使用 cache_fu 的 model 裡,卻老是出現這樣的錯誤訊息:

protected method `send' called for #<MemCache:0x3388db4>

基本上就是說,MemCache 這個 class 的 send 方法是被定義為 protected method,因此不能呼叫。怪哉,send 在 ruby 語言中,乃是非常基層的方法,每個物件皆有,怎有可能被定義為 protected ?一查之下果然發現元兇,乃是 Ruby-MemCache 這包 rubygem。

Locomotive 裡附了兩套關於 memcached 的 rubygem,其一是 Ruby-MemCache,其二則是 memcache-client。也許是為了方便而兩者皆附,但 cache_fu 所需要的,其實是後者。但在兩者皆有的狀態下,require "memcache"永遠是載入 Ruby-MemCache 裡面的 memcache.rb。而在此檔中,竟然將 send 方法蓋寫。不知該說是其作者大膽豪放,或是該說其迷糊不清,著實令人稱奇。

於是解決這問題的方法便呼之而出了:

gem uninstall Ruby-MemCache

也就是,將 Locomotive 裡附的 Ruby-MemCache 這包 rubygem 移除便是。

可見,若不希望自已寫的函式庫被反安裝,相容性很重要啊。