5

私は最近、バージョンが に依存していresources_controllerたため、 の gem バージョンから に切り替えました。 plugingemgit

vendor/plugins/plugin/lib/plugin.rbファイル内で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

イニシャライザの 1 つにa を追加しましたがrequire 'resources_controller'、このファイルを適切にロードしています。問題は、Railtieが評価される (putsクラス ブロック内の a がヒットする) にもかかわらず、実際には初期化ブロック自体を呼び出すようには見えないことです。これは、メソッドActionControllerを含めるために拡張する場所であるため、もちろん重要です。resources_controller_for

この質問は、ここここで出てきたようです。どちらの場合も、問題を回避する他の方法を見つけましたが、ブロックが呼び出されなかった理由について直接的な回答はありませんでした。

Rails docs で私が言えることから、初期化ブロックに好きな名前を付けることができ、実行する必要があります。問題ではないと思いますrails s -e productionが、開発モードでも同じ問題が存在すると思いますが、本番環境で実行しているときに最初に問題に気付きました。

何が起こっているのでしょうか?

参考までに、完全なプラグインはこちら: https://github.com/ianwhite/resources_controller

4

1 に答える 1

7

ここでの問題は、イニシャライザ プロセスが開始されると、新しいイニシャライザを追加できないことです。

ここでは、イニシャライザ プロセス中にイニシャライザを登録するコードが必要です。Gemfile で gem を使用する場合、初期化子は次のコードに登録されます。

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も初期化プロセス中に設定されるため、 で require できないことresources_controllerですapplication.rb

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

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

その後、イニシャライザから require 行を削除すると、バンドラはプラグインがローカルでチェックアウトされた gem であることを認識し、git を使用した場合と同じように動作します。

于 2011-12-10T06:13:19.013 に答える