先日、require_relativeっていうのを見かけて、これなんだろうと思って調べました!どうもRuby1.9.2から導入されたモジュールみたいですね。

そもそも、Ruby1.9.2以降とそれより前のバージョンとでは、$LOAD_PATHの扱いに違いがあります。例えば、Ruby1.8.7では$LOAD_PATHにはカレントディレクトリも含まれます。

$ rbenv shell 1.8.7-p375
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby/1.8/i686-darwin13.4.0
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8
/Users/sasata299/.rbenv/versions/1.8.7-p375/lib/ruby/1.8/i686-darwin13.4.0
.

一方、Ruby2.1.2では、カレントディレクトリが含まれません。

$ rbenv shell 2.1.2
$ ruby -e 'puts $LOAD_PATH'
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/site_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin13.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0
/Users/sasata299/.rbenv/versions/2.1.2/lib/ruby/2.1.0/x86_64-darwin13.0

そのため、Ruby2.1.2で、カレントディレクトリにあるファイルを単純にはrequireすることが出来なくなっています。カレントディレクトリにあるファイルをrequireするためには、$LOAD_PATHにカレントディレクトリ (.) を追加するか、もしくは以下のように相対パスで指定します。

require "./foobar"

ただこれも万能というわけでは無いので注意です。違うディレクトリから実行しようとすると当たり前ですがうまく動作しません。。

これに対する解決策が、require_relativeです。require_relativeを使うことで、そのファイルからの相対パスで指定することが出来ます。違うディレクトリから実行しても動作します。

require_relative "foobar"

ということで、Ruby1.9.2以上で$LOAD_PATHに含まれないファイルを読み込む必要があるときにはrequire_relativeを使いましょう :)
このエントリーをはてなブックマークに追加