これが私のサンプルRailsモデルクラス(app / models / user.rb内)です:
class User < ActiveRecord::Base
puts "loading user model"
include Auth::User # module is in the Auth engine
end
ここに、authという名前のエンジンのモジュールがあります(ファイルはvendor / engines / app / models / auth / user.rbにあります)
module Auth
module User
puts "loading module"
self.included(base)
puts "module is included"
end
end
end
rails(3.1.1 ruby 1.92)が起動すると(非開発中)、「ユーザーモデルの読み込み」と「モジュールの読み込み」が表示されますが、「モジュールが含まれています」は表示されません。
モジュールの名前とファイル名をmodels/auth / user.rbからuser_auth.rbに変更すると、モジュールがrails initプロセスに「十分に早く」含まれている場合に「含まれている」と表示される場合があります(以下を参照)。モジュールの名前とファイル名をUserとして保持したいと思います。これを変更しなければならない理由はありません。また、Userモデルをいつロードするか(およびUserモデルにauth / userモジュールが含まれるか)は重要ではありません。
注:上記で「5月」と言うと、これが私が観察することです。RailsがUsersControllerをロードする必要がある場合、Userオブジェクトがロードされるだけで、ユーザーの名前を変更した場合にのみUserモジュールが含まれます。 UserAuth(またはモデル名と同じ名前ではないもの)へのモジュール。ルートが原因でUsersControllerをロードするのが「起こります」。印刷したスタックトレースのおかげで、これを知っています。したがって、1)モジュールの名前を変更し、2)コントローラーで強制的にロードすることで、モジュールを含めることができます。
注:続行...モジュールがロードされるのは、モジュールを含むクラスが、railsの起動プロセスの早い段階でロード/必要になった場合のみです。これが、(ルートをロードするために)RailsにUsersControllerを「参照」させることにより、Userモデルを「早期」にロードするように強制することには、auth/userモジュールも含まれる理由です。
注:コンソールを実行して(ここでも非開発モードで)、require'user'を実行すると、モジュールは含まれません。したがって、レールが完全にロードされるまで「待機」すると、Userが必要なときに、auth/userモジュールが含まれません。これは少し不正確だと思います。railsの初期化プロセス中にユーザーモデルが読み込まれ、auth / userモジュールが読み込まれているのがわかりますが、その時点でauth/userモジュールが含まれているのはわかりません。ユーザーモデルがrailsinitプロセスで「早期に」ロードされた場合にのみ、モジュールが含まれていることがわかります。または、「レールの初期化プロセスで魔法の時間にロードされる」かもしれません。
誰かが光を当てることができますか?Userクラスを開いたり、モジュールを再度含めたりするなど、モジュールを含めるためにさまざまなことを試みました。これは時々機能するように見えましたが、一貫しては機能しませんでした。