Rails5 の require_dependency を使ってみる
Ruby Ruby on Rails
Published: 2019-07-11

やったこと

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

参考