定数の取り扱い

Rails における定数の読み込み

Rails の development モードでは、config/application.rb(あるいはエンジンの場合、lib/hoge/hoge.rb)で明示的に require された定数を除いて、基本的に定数は自動読み込みされます。(標準ライブラリや gem などは明示的に require する必要がある。)

production モードでは、基本的に事前一括読み込み (eager loading) が行われるため、ほとんどの場合 development モードのような自動読み込みは発生しません。

参考:

定数の自動読み込みと再読み込み | Rails ガイド [公式]

Rails で定数を定義する | kurobara のブログ

Ruby on Rails で定数の指定 – Qiita

定数 | あきくもちゃのブック

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

ファイル名とモジュールの命名規約

参考:

Rails で lib 以下を読み込ませる方法とその注意点 〜名前重複の死を避けるために〜 – Qiita

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です