2013-06-16 5 views
17

ich die folgende Fehlermeldung erhalten nach dem Upgrade 4 Rails:„Keine solche Middleware einfügen vor: Rack :: Lock (Runtime)“ nach dem Upgrade auf Rails 4

.../ruby-1.9.3-p125/gems/actionpack-4.0.0.rc2/lib/action_dispatch/middleware/stack.rb:125:in 'assert_index': No such middleware to insert before: Rack::Lock (RuntimeError)

Die Codezeile ist mein "remove slashes" Rack-Rewrite-Regel:

config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do 
    r301 %r{^/(.*)/$}, '/$1', :headers => {'Cache-Control' => 'public, max-age='+2.week.to_s} 
end 

Irgendwelche Ideen?

Antwort

38

Wie der Fehler schlägt vor („Keine solche Middleware vor einfügen“), ist das Problem mit der Middleware Sie einfügen versuchen, bevor (und nicht die Middleware Sie einfügen versucht werden, das war meine anfängliche Annahme).

In Rails4 ist Threading standardmäßig aktiviert, wodurch Rack::Lock entfernt wird.

Um einen Ersatz zu finden, können Sie rake middleware aus Ihrem Rails-Projektverzeichnis ausführen und nach etwas in der Nähe des Stapelstarts suchen. Ich werde Rack::Runtime auswählen, wie es früh im Stapel ist, und scheint ziemlich Standard.

So ist die Rewrite Konfiguration ist jetzt:

config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do 
    r301 %r{^/(.*)/$}, '/$1', :headers => {'Cache-Control' => 'public, max-age='+2.week.to_s} 
end 
+3

nur eine Sache, die mich für eine Weile verwirrt war 'Rake middleware' die vollständige Liste der erwarteten Middleware, einschließlich' Rack-zurückkehrte :: Lock' und noch meine rspec Tests scheiterten, weil "Rack :: Lock" nicht gefunden wurde. Am Ende erkannte ich (indem ich config.middleware direkt untersuchte), dass rspec natürlich nicht den vollen Middleware-Stack geladen hat. Ich habe daher die Umschreibungen in 'config/environments/production.rb' verschoben, da ich diese Weiterleitungen in rspec sowieso nicht testen würde. –

+0

Danke, dass du das herausgefunden hast! Die Ressource, zu der Sie in Ihrer Antwort verlinken, existiert leider nicht mehr. – Aaron