🌟 ZeitwerkはRailsの振る舞いを支えるローダー
Zeitwerk (ツァイトヴェルク) は Rails 6 以降のデフォルトローダで、
名前空間とファイル構成をベースにclass/moduleをオートロードする機構 です🚀
これがあるからRailsは
-
requireしなくても class/module を自動読み込む - MVCの分離がきれい
- ファイル名やパスの要求が明確
などの魅力を持っています。
🔎 Zeitwerkがどんなことをしているの?
一言で言うと、Zeitwerkはファイル名からクラス名を判断してrequireしてくれるローダーです。
# app/models/user.rb
class User < ApplicationRecord
end
なら User を見たとき Rails は:
require "/path/to/app/models/user.rb"
を自動で行ってくれます📊
🏢 Zeitwerkに合わせたファイル名 / 配置ルール
Zeitwerk は「ファイル名ベースでclass/moduleを読む」という他のRubyフレームにはないルールを持ちます。
例:Userクラス
| クラス名 | ファイルパス |
|---|---|
User |
app/models/user.rb |
Admin::User |
app/models/admin/user.rb |
Api::V1::BaseController |
app/controllers/api/v1/base_controller.rb |
名前空間はパスで表現する必要があります!
🚨 関連トラブル:Zeitwerkの誤判「使われてる名前だよ!」
Rails の generator (例: rails g controller home index) で
The name 'HomeController' is either already used in your application or reserved by Ruby on Rails.
などと言われたら、それは Zeitwerk がクラス名の重複を誤判している可能性が高いです。
例:
- 過去に同名のクラスを作って削除した
-
root "home#index"などが\uroutes.rb に書かれている -
app/controllers/home/みたいな名前空間がある
このような場合に、Zeitwerkは誤判して警告を出します。
🚀 Zeitwerkを上手に使うTips
- 名前は CamelCase にする
- ファイル名は snake_case にする
- 配置は class/module の名前に合わせる
- 名前空間を使うときは パス構成に注意
🤖 まとめ
| テーマ | 解説 |
|---|---|
| Zeitwerk は名前空間ベースのオートローダー | Rails6以降の機構 |
| require が不要 | 自動読み込みスマート |
| 名前による誤判もある | routesや分割に注意 |
Railsのコードベースは思ってるより「名前」に依存しています。
Zeitwerkを理解すればRailsが「なぜここにこのファイルを組み込んでるのか」が理解できます💡
少しでもどなたかのお役に立てば幸いです☺️