LoginSignup
1
0

More than 3 years have passed since last update.

特定のディレクトリ内のファイルを一括でrequireした話

Posted at

元々の状況・課題

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.rbuser_b.rbを文字列として配列に入れることになります。
その後は、この配列をeach文でそれぞれrequireする処理を実行しています。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0