rspecを導入してrubocopを実行すると以下のConventionが表示された
$ bundle exec rubocop
〜省略〜
spec/rails_helper.rb:4:14: C: Style/ExpandPathArguments: Use expand_path('../config/environment', __dir__) instead of expand_path('../../config/environment', __FILE__).
require File.expand_path('../../config/environment', __FILE__)
^^^^^^^^^^^
〜省略〜
rubocopが言っていること:
expand_path('../../config/environment', __FILE__)
の代わりに
expand_path('../config/environment', __dir__)
を使ってね。
本当に書き直していいのか?:
expand_path
、__FILE__
、__dir__
がフワッとしていたので今回の内容に合わせて整理
- 取得したいものは、
{app_dir}/config/environment
- File.expand_pathは第1引数の絶対パスを返す。
- File.expand_pathの第2引数は参照の基準となるパス。
-
__FILE__
は実行ファイル名を相対パスで取得する -
__dir__
は実行ファイルのディレクトリ名を絶対パスで取得する
試してみる:
ディレクトリ構成
{app_dir}
├── config
│ ├── environment.rb # ←ここを参照しようとしている
├── spec # 実行されるカレントディレクトリ
│ ├── rails_helper.rb # ←ここから
検証
$ cd spec/
$ pry
[1] pry(main)> File.expand_path('../../config/environment', __FILE__)
=> "/Users/XXX/app/{app_dir}/config/environment"
[2] pry(main)> File.expand_path('../config/environment', __dir__)
=> "/Users/XXX/app/{app_dir}/config/environment"
同じ結果が取得できた。書き換えても問題ない。
参考:
https://docs.ruby-lang.org/ja/latest/method/File/s/expand_path.html
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/__dir__.html