よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

August 09, 2008 [おもひで]

[Rails] Ruby-GetText-1.92.0を使ってもまだfile_exists?のエラーが出る

というレポートがあった。レポートではCellというプラグインと一緒に使うと出るというのでそれを調べてみた。

まず、file_exists?問題の整理をすると、Rails-2.0.xからRails-2.1.0でActionView::Base#file_exists? メソッドが ActionView::TemplateFinder#file_exists?に移ったことが原因で、ActionView::Base#file_exists? メソッドを呼び出そうとしているコードはコケるようになってしまう、というもの。

Ruby-GetText-Package-1.92.0以前ではワークアラウンドとしてこちらのサイトの情報を使っている人が多かったみたいだけど、この回避策は、平たく言えばRails-2.0.0と同じActionView::Base#file_exists?をRails-2.1.0で使えるように復活させるものであって、Railsとして、file_exists?はTemplateFinderが持つべき、というポリシーの変更には適さない(もちろん有効な手段であることは間違いなかったけど)。

そこで、Ruby-GetText-Package-1.92.0では、正しい解決策として(だと思って)、TemplateFinder#file_exists?を使うように修正した。

一方、Cellは自前のCell::TemplateFinderというものを持っていて、これをRailsのActionView::TemplateFinderと置き換えている模様。置き換えるのは良いんだけど、Cell::TemplateFinderは何も継承しない独自のクラスで、file_exists?というメソッドを持ってない。結果、Ruby-GetText-Package-1.92.0がTemplateFinder#file_exists?を呼び出そうとしてコケてしまう。

ダックタイピングも良いけど、TemplaeFinderを置き換えるのに、オリジナルのクラスの公開メソッドと非互換性があるってのはいかがなものか・・・。というわけで、もっとも単純な解決策はCell::TemplateFinderがActionView::TemplateFinderを継承することで、次に単純なのはfile_exists?をCell::TemplateFinderが実装すること。

それにしても、このfile_exists? を移したという修正は結構いろいろなところで影響が出ているんじゃないかなぁ。i18n化の件といい、混乱は続くよどこまでも。


編集