2013-06-16 23 views
17

Tôi nhận được lỗi sau khi nâng cấp lên Rails 4:"Không middleware như vậy để chèn trước: Rack :: Khóa (RuntimeError)" sau khi nâng cấp lên 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)

Dòng vi phạm là "remove slashes" quy tắc ghi đè giá của tôi:

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

Bất kỳ ý tưởng nào?

Trả lời

38

Khi lỗi gợi ý ("No middleware như vậy để chèn trước"), vấn đề là với các middleware bạn đang cố gắng chèn trước (và không phải là middleware bạn đang cố gắng chèn, đó là giả định ban đầu của tôi).

Trong Rails4, luồng được bật theo mặc định sẽ xóa Rack::Lock.

Để tìm thay thế, bạn có thể chạy rake middleware từ thư mục dự án đường ray của mình và tìm kiếm thứ gì đó gần đầu ngăn xếp. Tôi sẽ chọn Rack::Runtime vì nó ở đầu trong ngăn xếp và có vẻ khá chuẩn.

Vì vậy, các cấu hình viết lại bây giờ là:

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

Chỉ cần một điều mà nhầm lẫn tôi trong một thời gian là 'cào middleware' được trả về toàn bộ danh sách các middleware dự kiến ​​bao gồm' Kệ :: Lock' nhưng rspec của tôi kiểm tra đã thất bại do không tìm thấy 'Rack :: Lock'. Cuối cùng tôi nhận ra (bằng cách kiểm tra config.middleware trực tiếp) rằng rspec tất nhiên là không tải toàn bộ chồng phần mềm trung gian. Do đó, tôi đã chuyển các ghi đè sang 'config/environment/production.rb' vì tôi sẽ không thử nghiệm các chuyển hướng này trong rspec. –

+0

Cảm ơn bạn đã tìm hiểu điều này! Tài nguyên bạn đang liên kết đến trong câu trả lời của bạn không còn tồn tại. – Aaron

Các vấn đề liên quan