はじめに
みなさん、こんにちは torihaziです。
今回はカスタムの名前空間を作っていきます。
公式ドキュメントを読めば1発なのですが。
そもそもなぜ作りたくなったかというとRailsにおいて
Services::やActions::から始まる名前空間を作りたかったからです。
今までMVCアーキテクチャの元やっていたら、どうしてもfatなコントローラから逃げられなくて
それでAIに聞いてみたらActionやService使ったらええで!ってことだったので
適当にディレクトリを作ってみたのですが、うまくいかず公式ドキュメントで解決したのでその備忘録です。
やりたいこと
app/services/v1/hoge/hoge_hoge.rbについて他で呼び出すときに
Services::V1::Hoge::HogeHoge
みたいにして呼び出したい。
結論
Rails の自動読み込みと再読み込み - Railsガイド
こちらを参考に。
config/initilizers/autoloading.rb
# frozen_string_literal: true
module Actions; end
module Services; end
Rails.autoloaders.main.push_dir("#{Rails.root}/app/services", namespace: Services)
Rails.autoloaders.main.push_dir("#{Rails.root}/app/actions", namespace: Actions)
終わりに
本当はRailsはオートローディングの機能があるのでapp配下にディレクトリ作れば勝手に読み込まれて使える、
つまりTypeScriptのようにimportして云々しないでも Controllerで使えるのですが、
上のことをやらないと "Services::"ってprefixつけられないんですよね
だから少しかっこよくするためにこうしました。
app/services/users/signup.rbは、デフォルトではUsers::Signupを定義することになっています。
公式もこういってるし。かといって app/services/servicesとするのもダサいし。
実務でもやっていたけどこういうことがしたかったからなのね、納得。