1

アプリ初期化子を介してエンジン 2 からの懸念でエンジン 1 からモデルを拡張しようとしていますが、奇妙な動作が発生しています。

懸念

module Engine2
  module Concerns
    module MyConcern

      extend ActiveSupport::Concern

      included do
        puts "Concern included!"
      end

      def jump
        puts 'Jumping!!!!'
      end
    end
  end
end

初期化子

require 'engine2/my_concern'

module Engine1
  class Member
    include Engine2::Concerns::MyConcern
  end
end

アプリケーションを起動するConcern included!と、コンソールに期待どおりのメッセージが表示され、Memberクラスはメソッドを呼び出すことができますjumpが、ホスト アプリのコードを変更するとすぐに次のエラーが発生します。

NoMethodError (undefined method 'jump' for #<Engine1::Member:0x007fe7533b4f10>)

サーバーをリロードする必要があり、ホストアプリで別の変更を行うまで再び正常に動作し、エラーが再びスローされます.なぜこれが起こっているのですか?どうすれば回避できますか?

初期化子の代わりに懸念事項を含めるために、クラスの開始を実行するより良い場所はありますか?

4

1 に答える 1

0

だから私は最終的にそれを理解しました、基本的に何が起こるかというと、開発モードではコードが変更されるたびにすべてのモデルがリロードされますが、初期化子はサーバーの起動時に一度だけ実行されるため、コントローラーでコードが変更されるとモデルがリロードされますが懸念はもう含まれていないため、中断します。

イニシャライザのコードを のto_prepareブロックに移動することで解決しましたapplication.rb

知らない人のためにto_prepare、開発モードではすべてのリクエストの前、または本番環境では最初のリクエストの前に実行される準備コールバックを追加します。

于 2016-12-11T17:30:04.917 に答える