2016-01-28 14 views
13

異なるシステムが私のシステムでどのようにやりとりされるかによって、エンジンがレールアプリケーションにマウントされています。私は最近、いくつかのミドルウェア機能を提供する新しい宝石の開発に着手しました。このようなのエンジンのエンジンからミドルウェアを使用する方法

並べ替え:

BaseApp 
\ 
    Engine 
    \ 
    NewMiddlewareEngine 

# BaseApp/Gemfile 
gem 'Engine' 

# Engine/Gemfile 
gem 'NewMiddlewareEngine' 

# rake middleware output: 
[email protected][BaseApp]$ bundle exec rake middleware 
use Rack::Sendfile 
use ActionDispatch::Static 
use Rack::Lock 
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x6ebf30e1> 
use Rack::Runtime 
use Rack::MethodOverride 
use ActionDispatch::RequestId 
use Rails::Rack::Logger 
use ActionDispatch::ShowExceptions 
use ActionDispatch::DebugExceptions 
use ActionDispatch::RemoteIp 
use ActionDispatch::Reloader 
use ActionDispatch::Callbacks 
use ActiveRecord::Migration::CheckPending 
use ActiveRecord::ConnectionAdapters::ConnectionManagement 
use ActiveRecord::QueryCache 
use ActionDispatch::Cookies 
use ActionDispatch::Session::CookieStore 
use ActionDispatch::Flash 
use CatchJsonParseErrors 
use ActionDispatch::ParamsParser 
use Rack::Head 
use Rack::ConditionalGet 
use Rack::ETag 
run BaseApp::Application.routes 

しかし、私はNewMiddlewareEngineはミドルウェアに表示するように見えることはできません。

BaseApp 
\ 
NewMiddlewareEngine 

# BaseApp/Gemfile 
gem 'NewMiddlewareEngine' 

# rake middleware output: 
[email protected][BaseApp]$ bundle exec rake middleware 
use Rack::Sendfile 
use ActionDispatch::Static 
use Rack::Lock 
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x2f9795d8> 
use Rack::Runtime 
use Rack::MethodOverride 
use ActionDispatch::RequestId 
use Rails::Rack::Logger 
use ActionDispatch::ShowExceptions 
use ActionDispatch::DebugExceptions 
use ActionDispatch::RemoteIp 
use ActionDispatch::Reloader 
use ActionDispatch::Callbacks 
use ActiveRecord::Migration::CheckPending 
use ActiveRecord::ConnectionAdapters::ConnectionManagement 
use ActiveRecord::QueryCache 
use ActionDispatch::Cookies 
use ActionDispatch::Session::CookieStore 
use ActionDispatch::Flash 
use CatchJsonParseErrors 
use ActionDispatch::ParamsParser 
use Rack::Head 
use Rack::ConditionalGet 
use Rack::ETag 
use NewMiddlewareEngine # Notice it mounts fine on it's own 
run BaseApp::Application.routes  

そして:

両方が正常に動作
BaseApp 
\ 
Engine 

# BaseApp/Gemfile 
gem 'Engine' 

# rake middleware output: 
[email protected][BaseApp]$ bundle exec rake middleware 
use Rack::Sendfile 
use ActionDispatch::Static 
use Rack::Lock 
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x6ebf30e1> 
use Rack::Runtime 
use Rack::MethodOverride 
use ActionDispatch::RequestId 
use Rails::Rack::Logger 
use ActionDispatch::ShowExceptions 
use ActionDispatch::DebugExceptions 
use ActionDispatch::RemoteIp 
use ActionDispatch::Reloader 
use ActionDispatch::Callbacks 
use ActiveRecord::Migration::CheckPending 
use ActiveRecord::ConnectionAdapters::ConnectionManagement 
use ActiveRecord::QueryCache 
use ActionDispatch::Cookies 
use ActionDispatch::Session::CookieStore 
use ActionDispatch::Flash 
use CatchJsonParseErrors 
use ActionDispatch::ParamsParser 
use Rack::Head 
use Rack::ConditionalGet 
use Rack::ETag 
run BaseApp::Application.routes 

私はこれを取り付けテストしてみました。問題は、Engineを通じてNewMiddlewareEngineをマウントしようとするときです。

誰もこのような設定方法を知っていますか?

はここMyMiddlewareEngineは取り付けています:

module MyMiddlewareEngine 
    class Railtie < Rails::Railtie 
    initializer "add_my_middleware_engine_route_middleware" do |app| 
     app.middleware.use 'MyMiddlewareEngine' 
    end 
    end 
end 
+0

'rake middleware'の出力を提供できますか – Tawan

+0

ええ、確かです。 3つすべてのバリエーションのミドルウェア出力を含めるように更新しました。 – SortingHat

+0

他のエンジンのイニシャライザで 'config.middleware.use NewMiddlewareEngine'を試しましたか?そのエンジンのイニシャライザは確実に動作しているので、それが動作するためのコードを置く必要があります。これにより、アプリケーションコードを変更する必要はありません。 –

答えて

0

Rails::Engine Edge APIドキュメントから:

class MyEngine < Rails::Engine 
    # Add a load path for this specific Engine 
    config.autoload_paths << File.expand_path("../lib/some/path", __FILE__) 

    initializer "my_engine.add_middleware" do |app| 
    app.middleware.use MyEngine::Middleware 
    end 
end 

私は(責任の分離などの)エンジンにアプリケーションレベルで実行していないために、レールのミドルウェアを設定する傾向があります。私はこのアプローチを使用して、マウントされたレールアプリケーション(exampleを参照)から認証を分離しました。このため構成がapplication.rbである:あなたがレールコンソールを実行したときに

module MyApp 
    class Application < Rails::Application 
    .. 
    config.middleware.use NewMiddlewareEngine 

あなたはすべての例外を参照していますか? Stringの代わりに上記のような定数名を使用してみましたか?

+0

メインアプリケーションのapplication.rbですか?私はGemfileに1行しか入れずに、他の編集とは対照的に、私のエンジンを組み込むことができたかったのです。あなたが言及した理由のためにレールティを使用しようとしました。私はレールティがアプリケーション全体の構成を可能にすると思う。奇妙なことは、私は最終的にアプリケーションで実行されるエンジンにエンジンを置いていることです(私はそのダイアグラムを表示しようとしました)。 – SortingHat

+0

これは、アプリケーションレベルで設定する必要があるという意味で正しいと思います。起こっているように見えるのはレールティが取り付けられているものを初期化することですが、第2層が深いときにはレールティの初期化は決して呼び出されません。 MyMiddlewareEngineは、それがマウントされているエンジンではなくメインアプリケーション用に設定されている必要があります。 – SortingHat

+0

「App Engine/MiddlewareEngine」の構造を残して、App/config/application.rbに「config.middleware.use NewMiddleWareEngine」を追加すると、「NameError:初期化されていない定数App :: Application :: MiddlewareEngine」が生成されます。したがって、設定はメインアプリに伝播しません。私はインクルードをつぶすつもりです。 – SortingHat

関連する問題