やったこと
Rails の require_dependency を使ってみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
クラス名が衝突する
app/controllers/concerns/hoge/piyo_controller.rb
- このファイルがロードされる時、Hoge::ApplicationController が呼ばれていないと
::ApplicationController を見に行ってしまいます。
module Hoge
class PiyoController < ApplicationController
end
end
app/helpers/application_controller.rb
module Hoge
class ApplicationController
def abc
p "method: #{__method__}"
end
end
end
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def root_app
p "method: #{__method__}"
end
end
出力結果
irb(main):009:0> Hoge::PiyoController.new.abc
Traceback (most recent call last):
1: from (irb):9
NoMethodError (undefined method `abc' for #<Hoge::PiyoController:0x00007fb4244b20c8>)
irb(main):010:0> Hoge::PiyoController.new.root_app
"method: root_app"
=> "method: root_app"
以上より、::ActionController が継承されていることが分かります。
クラス名の衝突を解決する
変更があるファイルだけ載せます。
解決方法は下記の方法があるようでした。
- 名前空間をきっちり記述する
- require_dependency を使う
今回は require_dependency を使います。
require_dependency 'app/helpers/application_controller'
module Hoge
class PiyoController < ApplicationController
end
end
出力結果
irb(main):012:0> Hoge::PiyoController.new.abc
"method: abc"
=> "method: abc"
irb(main):013:0> Hoge::PiyoController.new.root_app
Traceback (most recent call last):
1: from (irb):13
NoMethodError (undefined method `root_app' for #<Hoge::PiyoController:0x00007fb423ee5a00>)
Hoge::ApplicationController が継承されていることが分かりました。
ちなみに
Rails がファイルを読み込むときのパスは下記のようになっています。
irb(main):001:0> puts ActiveSupport::Dependencies.autoload_paths
/Users/demo/app/assets
/Users/demo/app/channels
/Users/demo/app/controllers
/Users/demo/app/controllers/concerns
/Users/demo/app/helpers
/Users/demo/app/jobs
/Users/demo/app/mailers
/Users/demo/app/models
/Users/demo/app/models/concerns
/Users/demo/app/workers
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/assets
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/controllers
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/controllers/concerns
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/javascript
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/jobs
/Users/demo/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/activestorage-5.2.3/app/models
/Users/demo/spec/mailers/previews