Нет такого промежуточного программного обеспечения для вставки до: Rack::Lock (RuntimeError) после обновления до Rails 4

Я получаю следующую ошибку после обновления до 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)

Строка нарушения - это мое правило перезаписи стойки удалить косые черты:

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

Любые идеи?


person William Denniss    schedule 16.06.2013    source источник


Ответы (1)


Как следует из ошибки ("Нет такого промежуточного ПО для вставки ранее"), проблема связана с промежуточным ПО, которое вы пытаетесь вставить до (а не с промежуточным ПО, которое вы пытаетесь вставить). insert, что было моим первоначальным предположением).

В Rails4 многопоточность включена по умолчанию, что удаляет Rack::Lock.

Чтобы найти замену, вы можете запустить rake middleware из каталога вашего проекта rails и поискать что-то рядом с началом стека. Я выберу Rack::Runtime, так как он находится в самом начале стека и кажется довольно стандартным.

Итак, конфигурация перезаписи теперь такая:

config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
  r301 %r{^/(.*)/$}, '/$1', :headers => {'Cache-Control' => 'public, max-age='+2.week.to_s}
end
person William Denniss    schedule 16.06.2013
comment
Единственное, что меня смущало некоторое время, это то, что rake middleware возвращал полный список ожидаемого промежуточного программного обеспечения, включая Rack::Lock, и все же мои тесты rspec терпели неудачу из-за того, что не находили Rack::Lock. В конце концов я понял (изучив непосредственно config.middleware), что rspec, конечно же, не загружал полный стек промежуточного ПО. Поэтому я переместил перезаписи в config/environments/production.rb, так как я все равно не буду тестировать эти перенаправления в rspec. - person Stefan Magnuson; 05.02.2014
comment
Спасибо, что разобрались с этим! Ресурс, на который вы ссылаетесь в своем ответе, к сожалению, больше не существует. - person Aaron; 09.02.2016
comment
В моем случае мне нужно было поставить config.middleware.insert_before Rack::Runtime, Rack::LiveReload, что может быть специально для Rails ›=6. Подробности здесь, в rack-livereload README - person driftcatcher; 02.03.2021