RailsでRMagickをincludeするとName Errorになってしまう

久しぶりにプログラミングネタです。

かなりはまったのでメモ。

Ubuntu Linux 7.04、Rails 1.2.3という環境でRMagickをインクルードするとエラーになってしまいます。

require "RMagick"
include Magick
class TestController < ApplicationController
...

これを実行して何かのactionを実行するとこんなエラーが出ます。

Error calling Dispatcher.dispatch #<NameError: cannot remove Object::BZipCompression>

このあとredirect_toで別のページに飛ばしているのですが、you have been redirectedというリンクが出てしまいます。

どうもちゃんと動いていないようなのでネットで調べたり自分のコードをいじったりしていたのですが、なかなか解決しません。

ひょっとしてRailsのバグかなと思ってRails本家のTracを見てみると解決策がありました。

Ticket #6720 Instance Methods Disappearing

いまいち理解していないのですが、railsはどうやらrequireなどで読み込んだクラスを必要なくなると消しているようでそこでエラーになっているようでした。

RMagickはModuleなのですが、railsは普通のオブジェクトと勘違いしてそんなのないよみたいなエラーを吐いているようです。

なのでactivesupportのdependencies.rbというファイルのremove_constantというメソッドのコードを下のようにbegin rescueで囲んだらちゃんと動くようになりました。

def remove_constant(const)
return false unless qualified_const_defined? const
begin <- 追加
names = const.split('::')
if names.size == 1 || names.first.empty? # It's under Object
parent = Object
else
parent = (names[0..-2] * '::').constantize
end
log "removing constant #{const}"
parent.send :remove_const, names.last
rescue => err <- 追加
log err.inspect <- 追加
end <- 追加
return true
end

これが根本的な解決かわからないですが一応動いているみたいです。

次のリリースではこのあたりのフィックスも含まれるのでしょう。

まだまだRailsは不具合がありますね。

コメントを残す