2013-06-16 13 views
17

sto ottenendo il seguente errore dopo l'aggiornamento a Rails 4:"No such middleware per inserire prima: Rack :: Lock (RuntimeError)" dopo l'aggiornamento a 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)

La linea incriminata è la mia regola "remove slashes" rack riscrittura:

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

Tutte le idee?

risposta

38

Come l'errore suggerisce ("No such middleware di inserire prima"), il problema è con il middleware si sta cercando di inserire prima (e non il middleware si sta tentando di inserire, che era la mia ipotesi iniziale).

In Rails4, il threading è abilitato per impostazione predefinita e rimuove Rack::Lock.

Per trovare una sostituzione, è possibile eseguire rake middleware dalla directory del progetto rotaie e cercare qualcosa vicino all'inizio dello stack. Ho intenzione di scegliere Rack::Runtime poiché è all'inizio della pila e sembra piuttosto standard.

Così il config riscrittura è ora:

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

solo una cosa che mi ha confuso per un po 'è stato 'rastrello middleware' stava tornando l'elenco completo dei middleware previsto tra cui' Rack :: Lock' eppure la mia RSpec i test stavano fallendo a causa del mancato rilevamento di 'Rack :: Lock'. Alla fine mi sono reso conto (controllando direttamente da config.middleware) che rspec non stava ovviamente caricando l'intera pila di middleware. Pertanto ho spostato le riscritture in 'config/environments/production.rb', in quanto non testerei comunque questi reindirizzamenti in rspec. –

+0

Grazie per aver capito questo! Sfortunatamente, la risorsa a cui stai collegando nella tua risposta non esiste più. – Aaron