元々の状況・課題
Rubyでチケット料金モデリングに挑戦中。
特定のディレクトリ内のファイルを一つずつrequireするのが面倒。
今後特定ディレクトリ内にファイルが増えた際に、追加するのも面倒。
やったこと
下記コードを読み込みする側(User.rb)の一番上に書くことで、特定のディレクトリ内のコードを一括でrequireできました。
Dir[File.expand_path("../user_type", __FILE__) << "/*.rb"].each do |file|
require file
end
ディレクトリ構成は、ざっくりですがこんな感じです。
├── sample
│ ├── user.rb ←読み込みする側(requireする側)
│ └── user_type
│ ├── user_a.rb ←requireしたいファイル
│ └── user_b.rb ←requireしたいファイル
コードの説明
User.rb
Dir[File.expand_path("../user_type", __FILE__) << "/*.rb"].each do |file|
require file
end
1.[File.expand_path("../user_type", FILE) << "/*.rb"]について
-
File.expand_path
は、相対パスを絶対パスに変換した文字列を返す。 -
__FILE__
は実行ファイル名を返す。 -
<< "/*.rb"
は、"/*.rb"の文字列を追加する。
(参考)実行結果
# __FILE__なし
[File.expand_path("../user_type") << "/*.rb"]
=> ["/上の階層のパス/user_type/*.rb"]
# __FILE__あり
[File.expand_path("../user_type", __FILE__) << "/*.rb"]
=> ["/上の階層のパス/sample/user_type/*.rb"]
2.Dir[]について
リファレンスでこのように書いてあります。
ワイルドカードの展開を行い、パターンにマッチするファイル名を文字列の配列として返します。パターンにマッチするファイルがない場合は空の配列を返します。
ブロックが与えられたときはワイルドカードにマッチしたファイルを引数にそのブロックを 1 つずつ評価して nil を返します
今回のディレクトリ構成だと、"/上の階層のパス/sample/user_type/*.rb"
にマッチするuser_a.rb
とuser_b.rb
を文字列として配列に入れることになります。
その後は、この配列をeach文でそれぞれrequireする処理を実行しています。