2

これが私のサンプル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クラスを開いたり、モジュールを再度含めたりするなど、モジュールを含めるためにさまざまなことを試みました。これは時々機能するように見えましたが、一貫しては機能しませんでした。

4

1 に答える 1

0

クラス定義の前の最初の行でこれをモデルに追加できますか? (ここでデバッグするだけです。これが機能しない場合は、私に反対票を投じないでください)

 load "#{Rails.root}/vendor/engines/app/models/auth/user.rb"
于 2012-08-18T10:29:16.643 に答える