2016-01-28 17 views
13

Farklı mücevherlerin sistemimde nasıl etkileşime girdiğinden dolayı, raylar üzerine monte edilmiş bir motorum var. Son zamanlarda bazı middleware işlevselliği sağlayan yeni bir gem üzerinde çalışmaya başladı. Böyle birBir Motorda Bir Motordan Middleware Nasıl Kullanılır

Sıralama:

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 

Ancak, katman gösterilmesini NewMiddlewareEngine almak gibi olamaz. Bu montaj test ettik:

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  

Ve:

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 

çok iyi çalışıyor. Sorun, NewMiddlewareEngine 'Motor aracılığıyla' monte etmeye çalıştığım zamandır.

Böyle bir şeyi nasıl yapılandıracağını bilen var mı? Rails::Engine Edge API belgelerine

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

Evet, 'komisyon aracı yazılımının çıktısını sağlayabilirsiniz – Tawan

+0

Evet, kesinlikle. Tüm 3 varyasyon için ara katman yazılımı güncellemesi ekledim. – SortingHat

+0

Diğer motorun başlatıcısında 'config.middleware.use NewMiddlewareEngine' denediniz mi? Bu motorun başlatıcısı kesinlikle çalıştırılıyor, bu yüzden işe koyulması için kodu koymanız gereken yer olabilir. Bu uygulama kodunda herhangi bir değişiklik gerektirmemelidir. –

cevap

0

: Burada

MyMiddlewareEngine montaj var

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 

I (sorumlulukların ayrılması gibi) bir motorda uygulama düzeyinde çalıştırmak ve değil rayları ara katman yapılandırmak eğilimindedir . Bu yaklaşımı, monte edilmiş bir raylar uygulamasından ayırmak için kullandım (bkz. example). Bu yapılandırma application.rb içinde: Eğer raylar konsolu çalıştırdığınızda

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

herhangi istisnalar görüyor musunuz? String yerine yukarıdaki gibi sabit adı kullanmayı denediniz mi?

+0

Bu application.rb ana uygulamanızdan mı geliyor? Motorumun diğer düzenlemelere göre dahil edilmesini sağlamak için sadece Gemfile'da 1 satıra sahip olmak istedim. Ve bahsettiğin nedenden ötürü bir yağmurluk kullanmaya çalıştım. Bir railtinin uygulama boyunca yapılandırmaya izin vereceğini düşünüyorum. Garip olan şey, bir motorun nihayet bir uygulama üzerinde çalıştığı bir Engine'i (şema ile göstermeye çalıştım) yerleştirmekti. – SortingHat

+0

Sanırım bunun uygulama düzeyinde yapılandırılması gerektiği konusunda haklısınız. Çünkü, görünen şey, railtie, üzerine monte edilen şeyi başlatmasıdır, ancak ikinci bir katman derinleştiğinde, railtie başlatma işlemi hiçbir zaman çağrılmaz. MyMiddlewareEngine, bir şekilde ana uygulama için yapılandırılmalı ve içine monte edilmiş olan motoru değil. – SortingHat

+0

'App with engine with MiddlewareEngine' ve App/config/application.rb 'yapıyorum' config.middleware.use NewMiddleWareEngine '' NameError: uninitialized sabit App :: Uygulama :: MiddlewareEngine 'olsun. Böylece kurulum ana uygulamaya yayılmıyor. İçerikleri karıştırmaya çalışacağım. – SortingHat

İlgili konular