2012-05-01 8 views
2

Bundlerを使ってRailsプロジェクトをセットアップしました。私のバンドルされた宝石の1つに、Railsアプリケーションで使用したいRackミドルウェアが用意されています(ただし、 'production' Rails環境のみ)。BundlerとRailsプロジェクトのRackミドルウェアを適切に使う方法

私はちょうど私が不明な一定のエラーを取得し、config/environments/production.rbにこのような何かを置く場合:

config.middleware.use ::Rack::MyMiddleware 

... Bundler.requireは、まだこの時点で呼び出されていない、と私のバンドル宝石のどれもではないと思われるので、利用可能です。

私はこれを回避作業のいくつかの方法を発見したが、どれも素晴らしい思えない、と私は欠けているより標準的な解決策があります場合、私は思ったんだけど:config/environments/production.rb

    1. 明示的require 'my_middleware_gem'config.middleware.useコールをafter_initializeブロックで囲んで、定数を参照しようとする前にBundlerがその処理を実行できるようにします。
    2. 裸のクラス定数の代わりに文字列("::Rack::MyMiddleware")を使用します。これは何らかの理由でUnicornで動作しないようですが、他のサーバでも動作します(Unicornで"::Rack::MyMiddleware".newを呼び出すことになりますが、もちろん失敗します)。

    私はいくつかのより良いアプローチがありませんか?初期化プロセスのどの時点で、バンドルされた宝石が利用可能になるはずですか? "未回答" フィルタからこの質問を削除するために、コメントからの回答をコピー

  • +0

    をあなたの環境で利用可能です - 'Bundle.require'は' require 'rails/all''の直後に呼び出されます。宝石の名前は何ですか?それは必要なファイルと同じ名前ですか?あなたの 'gemfile'に' gem 'my_middleware_gem'、:require => 'rack/my_middleware'のようなものが必要ですか?参照:http://gembundler.com/gemfile.html – matt

    +0

    申し訳ありませんが、私はRails 2.3.8をまだ忘れています(私は知っています、私が知っている)http://gembundler.com/rails23 .html。私はBundler.requireが呼び出されたときの動作がRails 2と異なるかもしれないと思っています。あなたの提案に関して、宝石の名前はそれを使用するのに必要なrequireステートメントと一致し、 ':require'オプションを私のGemfileはこの特定の動作に影響を与えないようです。 – grumbler

    +0

    私は間違っていました--GemfileはRails 2と3の環境の後ではロードされません。Railsの定数のオートローディングのように見えますが、時にはそれで十分ですが、この場合はそうではありません。 – matt

    答えて

    関連する問題