kenjuの日記

About Programming, Mathematics and Security

RailsでConcernsを利用する場合のモジュール名前空間の衝突に注意

tl;dr

  • Concernsを定義するときに、他の箇所のモジュール名前空間と衝突するとLoad Error になる場合があるので注意
    • Rails v5において再現
  • 対応策としては、片方側のモジュール名を変更する
    • Concerns::X::Z & X::Y とするか
    • Concerns::X::Y & X::Z とする

実際にあった例

以下の二つのモジュール名前空間がそれぞれ衝突していた。

app/jobs/concerns/slack.rb:

module Concerns
  concern :Slack do
    #...
  end
end

app/jobs/slack/X.rb:

module Slack
  class X
    include Concerns::Slack
      #...
  end
end

このとき、LoadError が発生してしまっていた。ActiveSupportを長い間デバッグしていたが結局わからず。 ワークアラウンドとして、読み込まれるモジュール側の命名を変更した。

- `app/jobs/concerns/slack.rb`:
+ `app/jobs/concerns/slackable.rb`:

module Concerns
-   concern :Slack do
+   concern :Slackable do
    #...
  end
end