はっさんブログ

やってしまったことを書きます

【Ruby / Rails】クラス名を動的に生成する

参考になったらシェアいただけると幸いです!

背景

たまに必要になり、都度忘れるのでメモ

結論

# ActiveSupport::Inflectorの#classify, #constantizeを用いる
#=> rails c

klass_name = "upload_image"
klass = klass_name.classify.constantize

#=> UploadImage

classifyは文字列をキャメルケースの文字列に変更するメソッドです。

constantizeはキャメルケースの文字列を定数に変換して返す(該当の定数が存在する場合以外はエラー)ので、動的にクラス名を生成したい場合は実行する前に定義しておく必要があります。

resource = "video"
klass_name = "upload_#{resource}"
klass = klass_name.classify.constantize

#=> UploadVideo

なお、この方法はRails Wayじゃないよねという意見もあるらしく。

# rails c

class ClassName
end

klass = Object.const_get "ClassName"
#=> ClassName

Objectクラスから定数を探索する後者の方が、理解しやすい印象を受けました。

参考

stackoverflow.com

ref.xaio.jp

もはや同じこと書いてあった

qa.atmarkit.co.jp

ActiveSupport::Inflectorには他にも便利メソッドがあるようです。

techracho.bpsinc.jp