今回はRuby on Railsについてメモ。
autoloadで自動読み込みされないファイル
解決策がないかと思って、ググってみたところ、以下のページに解決策が書いてありました。
http://www.pistolfly.jp/weblog/2007/06/require-dependency.html
requireじゃなくて、require_dependencyでファイル読み込みすれば良いということでした。
require_dependencyの挙動については、上のリンク先を参照してください。
この辺り(autoload周辺)って、Ruby on Rails公式なドキュメントが見当たらないですねえ。・・・実装を読めってことか。
以下、問題のコード例と解決方法。(ruby 1.8.5, rails 2.3.3, WEBrick 1.3.1で実験しました。)
ファイル読み込みの対象となるファイルを用意します。
<rails_project>/lib/hoge_fuga.rb
[RUBY]
class Hoge
def hoge
return “abc”
end
end
[/RUBY]
上のファイルを読み込むcontrollerを用意します。
このとき、requireの代わりにrequire_dependencyでファイルを読み込みます。
<rails_project>/app/controllers/test_controller.rb
[RUBY]
#require ‘hoge_fuga’
require_dependency ‘hoge_fuga’
class TestController < ApplicationController
def hoge
a = Hoge.new
render(:text => a.hoge)
end
end
[/RUBY]
んで、Webサーバを起動。
$ cd <rails_project> $ ruby script/server
で、ブラウザからtest/hogeにアクセスすると、ブラウザ上にabcが出力されます。
この状況で、<rails_project>/lib/hoge_fuga.rbを以下のように書き換えてみます。
[RUBY]
class Hoge
def hoge
return “123”
end
end
[/RUBY]
変更を保存した後、ブラウザからtest/hogeにアクセスすると、ブラウザ上に123が出力されます。
確かに、Webサーバを再起動しなくても、<rails_project>/lib/hoge_fuga.rbが再読み込みされてますね。
これでデバッグがしやすくなるなあ。