4

バージョンがgitに依存しているので、最近私はresources_controllerの宝石バージョンからpluginに切り替えました。次のようにvendor/plugins/plugin/lib/plugin.rbファイル内Railtie Inititalizerがプラグインで実行されていません

Railtieは次のとおりです。

module Ardes 
    module ResourcesController 
    class Railtie < Rails::Railtie 
     initializer 'ardes.resources_controller' do 
     ActiveSupport.on_load(:action_controller) do 
      extend Ardes::ResourcesController 
      include Ardes::ResourcesController::RequestPathIntrospection 
     end 

     ActiveSupport.on_load(:active_record) do 
      include Ardes::ActiveRecord::Saved 
     end 
     end 
    end 
    end 
end 

私は私の初期化子の一つでrequire 'resources_controller'を追加しましたし、それが適切にこのファイルをロードしています。問題は、Railtieが評価されますが(クラスブロックのputsがヒットします)、実際にイニシャライザブロック自体を呼び出すことは決してないようです。もちろんこれは、メソッドを含むようにActionControllerを拡張しているので、重要です。

この質問は、herehereとなっているようです。両方のケースで、彼らは問題の周りに他の方法を見つけたが、なぜブロックが呼び出されていないのかについて直接的な答えはなかった。

私がRailsのドキュメントで知ることは、イニシャライザの名前を任意の名前にして実行する必要があることです。私はそれが重要だとは思わないが、私は最初に問題が生産モードで動作していることに気づいたrails s -e production私は同じ問題が開発モードに存在すると信じている。

何が起こっている可能性がありますか?参考のため

、フルプラグインはここにある:あなたがここに持っているhttps://github.com/ianwhite/resources_controller

答えて

6

問題は、初期化プロセスが開始された後、新しい初期化子を追加することができないということです。

ここでは、イニシャライザ処理中にイニシャライザを登録するコードが必要です。あなたはGemfileに宝石を使用する場合、初期化子は、このコードに登録されています

if defined?(Bundler) 
    # If you precompile assets before deploying to production, use this line 
    Bundler.require(*Rails.groups(:assets => %w(development test))) 
    # If you want your assets lazily compiled in production, use this line 
    # Bundler.require(:default, :assets, Rails.env) 
end 

初期化子を開始する前にこのコードが実行されます。対照的に、初期化プロセス中に実行されるイニシャライザファイルにはresources_controllerコードが必要です。その結果、新しいイニシャライザを登録するのは遅すぎます。

状況が複雑になるのは、vendor/plugins内のロードパスも初期化プロセス中に設定されるため、にresources_controllerを必要としないことです。

問題の最も簡単な解決策は、:path機能をbundlerで使用することです。プラグインをインストールした後、あなたのGemfileに次の行を追加します

gem 'resources_controller', :path => "vendor/plugins/resources_controller" 

あなたは、あなたの初期化子からラインを必要と削除することができ、そして場合バンドラはプラグインがローカルにチェックアウトした宝石であることを認識し、それがどうなるのかを行いますあなたはgitを使いました。

+0

答えをありがとう。私は最後にこれをやり終えたが、戻って返信を忘れてしまった。解説のおかげで、初期化プロセスの詳細を知ることができました。 –

関連する問題