コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ActiveSupportにはモジュール名の一部やクラス名の部分だけを取り出すためのメソッドがある

モジュールの部分はいらないんだけどな…というときに文字列処理をしなくても用意してくれている。

環境

$ bin/rails -v
Rails 6.0.3.1

利用例

今回サンプルとして扱うのは以下のようなクラス

module Hoge
  module Piyo
    class Test
      def initialize(test: nil)
        @test = test
      end
    end
  end
end 

newするときは以下のようにする

::Hoge::Piyo::Test.new

クラス名だけを取り出したい場合

demodulize を使う。ただし Class オブジェクトでは使えないので、 to_s などをしてあげる必要がある。

object = ::Hoge::Piyo::Test.new
object.class.to_s.demodulize
# => "Test"

モジュール部分だけを取り出したい場合

deconstantize を使う。こちらも Class オブジェクトでは使えないので注意。

object = ::Hoge::Piyo::Test.new
object.class.to_s.deconstantize
# => "Hoge::Piyo"

参考リンク

[Rails5] Active Support::Inflectorの便利な活用形メソッド群|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社