Ho un pezzo di middleware Rack che carica un tenant, tramite sottodominio, e applica alcune impostazioni predefinite. Il middleware, anche se non è bello, fa abbastanza bene il suo lavoro. Tuttavia, quando un'eccezione viene lanciata all'interno dell'app, il middleware "intercetta" la traccia dello stack completo. Quando dico trap intendo che nasconde la traccia di stack prevista.Traccia stack "trapping" middleware rack
Ecco un esempio.
sto un'eccezione in un'azione di un controller in questo modo:
def index
throw "Exception in a Rails controller action"
@taxonomies = Spree::Taxonomy.all
end
ci si aspetta che l'analisi dello stack sarebbe fare riferimento a questa posizione, ma non è così. Invece fa riferimento a una riga nel middleware.
Completed 500 Internal Server Error in 139ms
UncaughtThrowError (uncaught throw "Exception in a Rails controller action"):
lib/tenant_manager/middleware/loader.rb:42:in `call'
Perché succede? Hai mai visto qualcosa di simile?
Ecco il middleware:
# lib/tenant_manager/middleware/loader.rb
module TenantManager
module Middleware
class Loader
# Middleware to detect an tenant via subdomain early in
# the request process
#
# Usage:
# # config/application.rb
# config.middleware.use TenantManager::Middleware::Loader
#
# A scaled down version of https://github.com/radar/houser
def initialize(app)
@app = app
end
def call(env)
domain_parts = env['HTTP_HOST'].split('.')
if domain_parts.length > 2
subdomain = domain_parts.first
tenant = Leafer::Tenant.find_by_database(subdomain)
if tenant
ENV['CURRENT_TENANT_ID'] = tenant.id.to_s
ENV['RAILS_CACHE_ID'] = tenant.database
Spree::Image.change_paths tenant.database
Apartment::Tenant.process(tenant.database) do
country = Spree::Country.find_by_name('United States')
Spree.config do |config|
config.default_country_id = country.id if country.present?
config.track_inventory_levels = false
end
Spree::Auth::Config.set(:registration_step => false)
end
end
else
ENV['CURRENT_TENANT_ID'] = nil
ENV['RAILS_CACHE_ID'] = ""
end
@app.call(env)
end
end
end
end
Sono in esecuzione rubino 2.2.0p0
e rails 4.1.8
.
Ho cercato le reti per questo ma non ho trovato nulla, probabilmente perché non sto cercando la cosa giusta.
Qualche idea sul perché questo sta accadendo e su cosa sto facendo male?
Cheers!