Rubocop さんは親切なので bin/bundle も書き換えてくれます。
これを
... def gemfile gemfile = ENV["BUNDLE_GEMFILE"] return gemfile if gemfile && !gemfile.empty? File.expand_path("../../Gemfile", __FILE__) end ...
こうしてくれる
... def gemfile gemfile = ENV['BUNDLE_GEMFILE'] return gemfile if gemfile.present? File.expand_path('../Gemfile', __dir__) end ...
んだけどこれだと bin/bundle
はエラーを吐きます。
$ bin/bundle bin/bundle:42:in `gemfile': undefined method `present?' for nil:NilClass (NoMethodError) return gemfile if gemfile.present? ^^^^^^^^^ from bin/bundle:84:in `load_bundler!' from bin/bundle:110:in `<main>'
原因
Rubocopくん
ここが冗長なので
return gemfile if gemfile && !gemfile.empty?
こうしてくれた
return gemfile if gemfile.present?
正しい。間違ってはない。がしかし。
present?
メソッドさんが実は Rails 独自メソッド。Ruby の組み込みメソッドではない。
$ irb >> nil.present? (irb):1:in `<main>': undefined method `present?' for nil:NilClass (NoMethodError) from /Users/shmn7iii/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `load' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `<main>' >> "aa".present? (irb):2:in `<main>': undefined method `present?' for "aa":String (NoMethodError) Did you mean? prepend from /Users/shmn7iii/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `load' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `<main>' $ rails console >> nil.present? => false >> "aa".present? => true
Rails プロジェクトでの Rubocop なので親切に Rails のメソッドを使って改善してくれる。
がしかし bin/bundle
は Rubyスクリプトなので、Ruby にはない present?
メソッドで NoMethodError
が起こってしまう。というオチでした。
対策
rubocop.yml で正しく除外設定をしよう
AllCops: Exclude: - 'bin/**/*' ...