QA@IT
«回答へ戻る

回答を投稿

質問にあるように ruby ./db/main.rb とした場合はエラーにならず、ruby db/main.rb としたときにエラーになったため、このケースについて書きます。

最初に解決方法です。
どちらでもかまいません。

# require_relative を使う
require_relative '../app/hoge.rb'
# File.expand_path で絶対パスにする
require File.expand_path(File.dirname(__FILE__) + '/../app/hoge.rb')

で、質問の状況で hoge.rb をロードできない理由は下記の通りです。

  • __FILE__ にはフルパスが入るわけではない
  • ruby db/main.rb としたとき main.rb 内では __FILE__ == "db/main.rb" になる
  • よって実行されるのは require "db/../app/hoge.rb"
  • require は、/ や . で始まらない場合、$LOAD_PATH を探索する
  • Ruby 1.9.2 以降は $LOAD_PATH にカレントディレクトリが含まれないので、hoge.rb は見つからない

ruby ./db/main.rb とした時は __FILE__ == "./db/main.rb" になるので、ロードできるわけです。どちらにしろやっかいなので、最初に挙げた 2 つの方法のいずれかを使うことをおすすめします。

質問にあるように `ruby ./db/main.rb` とした場合はエラーにならず、`ruby db/main.rb` としたときにエラーになったため、このケースについて書きます。

最初に解決方法です。
どちらでもかまいません。

```ruby
# require_relative を使う
require_relative '../app/hoge.rb'
# File.expand_path で絶対パスにする
require File.expand_path(File.dirname(__FILE__) + '/../app/hoge.rb')
```

で、質問の状況で hoge.rb をロードできない理由は下記の通りです。

- `__FILE__` にはフルパスが入るわけではない
- `ruby db/main.rb` としたとき main.rb 内では `__FILE__ == "db/main.rb"` になる
- よって実行されるのは `require "db/../app/hoge.rb"`
- require は、/ や . で始まらない場合、$LOAD_PATH を探索する
- Ruby 1.9.2 以降は $LOAD_PATH にカレントディレクトリが含まれないので、hoge.rb は見つからない

`ruby ./db/main.rb` とした時は `__FILE__ == "./db/main.rb"` になるので、ロードできるわけです。どちらにしろやっかいなので、最初に挙げた 2 つの方法のいずれかを使うことをおすすめします。