2011-10-19 22 views
7

Używam aplikacji Rails 3.1 na Heroku Cedar Stack od kilku miesięcy. Używam oprogramowania pośredniczącego Rack :: Deflater do zgrywania zawartości i do osiągnięcia tego przezKonflikt Heroku między aktywowaniem zasobów gzip a prekompilacją aktywów

config.middleware.insert_before ActionDispatch::Static, Rack::Deflater 

w moim pliku staging.rb.

Jednak od zeszłego tygodnia, pojawia się następujący błąd podczas wdrażania do Heroku

Running: rake assets:precompile 
    rake aborted! 
    No such middleware to insert before: ActionDispatch::Static 

Jednak prowadzenie natarcia middleware wciąż powraca

use Rack::Cache 
use Rack::Deflater 
use ActionDispatch::Static 
use Rack::Lock 

i treść służył nadal skompresowane. Jednak zasoby nie zostały skompilowane (zminimalizowane), ponieważ wstępna kompilacja nie powiodła się. Ręczny prekompilacja rake'u :: aset też nie pomaga.

Zakładam, że ActionDispatch :: Static nie jest dostępny podczas wstępnej kompilacji zasobów. Więc próbowałem wstawić Rack :: Deflater przed Rack :: Lock, a teraz moje zasoby są kompilowane bez żadnego komunikatu o błędzie, ale treść nie jest spakowana gzipem.

Co więc muszę zrobić, aby zarówno skompresować i skompilować moje zasoby? czego mi brakuje? Dzięki.

Odpowiedz

3

Nadal nie rozumiem, dlaczego Heroku nie rozpoznaje ActionDispatch :: Static podczas wstępnej kompilacji zasobów. Jednak ludzie Heroku sugerowali obejście tego problemu.

Oprogramowanie pośredniczące Rack :: Deflater należy wstawić do pliku config.ru, a nie do plików środowiska. W ten sposób nie koliduje to z wstępną kompilacją zasobów i nadal gzips obsługiwaną zawartość.

Wszelkie informacje na temat działania pliku config.ru i miejsca, w którym obecnie znajduje się program Rack :: Deflater, są bardzo mile widziane.

+0

To jest fajne, ale nie tak fajne, jak wyświetlanie pliku .gz, który tworzy potok zasobów. Zastanawiam się, czy jest jakikolwiek sposób to zrobić? – maletor

+1

Oto [powiązane pytanie] (http://stackoverflow.com/questions/12326191/any-way-to-serve-gzip-assets-from-heroku), które mogą Ci się przydać. –

5

Wystarczy jeden heads up Rack::Deflateris already used by Rails 3.1, więc nie trzeba tego robić ręcznie.

ALE, aby odpowiedzieć na twój problem tutaj, zakładam, że Twój zestaw production.rb ma production.rb.

Oprogramowanie pośrednie ActionDispatch::Static jest używane tylko wtedy, gdy serve_static_assets jest ustawione na true. Heroku w rzeczywistości wstrzykuje tę konfigurację, aby nadpisać wszystko, co ustawiłeś, mimo to (zobacz komunikat dziennika Injecting rails3_serve_static_assets podczas wdrażania), ale nie jestem pewien na jakim etapie wdrażania to się dzieje.

Jest prawdopodobne, że nie masz włączonej obsługi zasobów statycznych, gdy działa assets:precompile (zauważ, że to tylko przypuszczenie, nie korzystam z Rails 3.1 Jeszcze więc mogę się mylić)

Polecam przeciwko sugestii membLoper za dodawania go ręcznie w pliku rackup:

  1. to nie jest potrzebne, jak wyjaśniono powyżej
  2. Twojej middleware, które są odpowiednie do aplikacji Naprawdę powinien być wstrzykiwany tak, jak pierwotnie próbowałeś w swoim application.rb
+0

Nie wydaje się, żeby tak było. Czy możesz wskazać główne źródło? – maletor

Powiązane problemy