Torihaji's Growth Diary

Little by little, no hurry.

Railsでカスタムの名前空間を作ったるで。

はじめに

みなさん、こんにちは 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とするのもダサいし。

実務でもやっていたけどこういうことがしたかったからなのね、納得。