定数の取り扱い
Rails における定数の読み込み
Rails の development
モードでは、config/application.rb
(あるいはエンジンの場合、lib/hoge/hoge.rb
)で明示的に require
された定数を除いて、基本的に定数は自動読み込みされます。(標準ライブラリや gem などは明示的に require
する必要がある。)
production
モードでは、基本的に事前一括読み込み (eager loading
) が行われるため、ほとんどの場合 development
モードのような自動読み込みは発生しません。
参考:
定数の自動読み込みと再読み込み | Rails ガイド [公式]
Rails で定数を定義する | kurobara のブログ
Rails 4 での定数をどこにおいておくべきか | めも帖
rails アプリ内で共通で使う変数の定義方法 | 煮卵もんすたー
Loading Constants – Ruby VS Rails – Part 2 | Simply Business
定数の再読み込み
# config/environments/development.rb config.cache_classes = false
> reload!
参考:
定数の再読み込み – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
イニシャライザで定数を初期化した場合の副作用
イニシャライザで定数を初期化すると、リロード時に再読み込みが効かず元のオブジェクトを保持し続ける。
参考:
自動読み込みとイニシャライザ – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
イニシャライザ内で require_dependency を使うべきでない理由
development
モード時にファイルが変更されていなくても、定数の再読み込みが強制的に発生する。
参考:
require_dependency とイニシャライザ – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
あいまいな定数の参照
親子関係のクラス/モジュールで同じ定数が定義されている場合に、正しい定数が自動読み込みされない。
使用する定数の名前空間を明示的に指定する。もしくは、require_dependency
を使って正しい読み込みをその場で行う必要がある。
# app/models/user.rb class User end
# app/models/admin/user.rb module Admin class User < ::User end end
# app/controllers/admin/user_controller.rb module Admin class UserController < ApplicationController def index @users = User.all end end end
この場合、Admin::UserController
内の修飾されていない User
は、::User
を参照するのか、Admin::User
を参照するのかあいまいになる。(ロード順によってどちらを指すかが変わってしまう。)
解決策1
修飾済み定数を使う
module Admin class UserController def index @users = Admin::User.all end end end
解決策2
require_dependency
を使って正しい定数を予めロードしておく
require_dependency "admin/user" module Admin class UserController def index @users = User.all end end end
参考:
相対参照 – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
定数がトリガーされない場合 – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
特異クラス内で定数を自動読み込みするためにはモジュール名を明示的に指定する
参考:
特異クラス内で自動読み込みを行う – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
config.autoload_paths
参考:
Rails の autoload_paths | kotaroito’s notes
Railsのautoload_paths を設定しているソースの箇所 – Qiita
config.paths.add
参考:
Rails で lib ディレクトリを使うときは config.paths.add を使おう – Qiita
production 環境での Autoload の廃止 – Qiita
自動モジュール
参考:
自動モジュール – 定数の自動読み込みと再読み込み | Rails ガイド [公式]
Rails の autoload の使い方に気をつけよう | TechRacho
ファイル名とモジュールの命名規約
参考: