2011-10-19 35 views
7

Tôi đã chạy một ứng dụng Rails 3.1 trên Heroku Cedar Stack trong một vài tháng ngay bây giờ. Tôi đang sử dụng Rack :: Deflater middleware để gzip nội dung của tôi và đạt được điều này bằng cáchXung đột Heroku giữa các nội dung gzipping và biên dịch trước các tài sản

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

trong tệp staging.rb của tôi.

Tuy nhiên, kể từ tuần trước, tôi nhận được lỗi sau khi triển khai để Heroku

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

Tuy nhiên, chạy cào middleware vẫn trả

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

Và nội dung phục vụ vẫn gzip. Tuy nhiên, tài sản không được biên soạn (được rút gọn) khi biên dịch trước thất bại. Một tay rake biên dịch trước :: asets cũng không giúp được gì.

Vì vậy, tôi giả sử ActionDispatch :: Tĩnh không có sẵn trong quá trình biên dịch trước tài sản. Vì vậy, tôi đã cố gắng để chèn Rack :: Deflater trước Rack :: Lock và bây giờ tài sản của tôi được biên soạn mà không có bất kỳ thông báo lỗi nhưng nội dung phục vụ không gzipped.

Vì vậy, tôi cần phải làm gì, cho cả gzip và biên dịch nội dung của mình? Tôi đang thiếu gì? Cảm ơn.

Trả lời

3

Tôi vẫn không hiểu tại sao Heroku không nhận ra ActionDispatch :: Tĩnh trong quá trình biên dịch trước tài sản. Tuy nhiên, Heroku folks đã đề xuất một giải pháp cho vấn đề này.

Giá đỡ :: Phần mềm trung gian Deflater cần được chèn vào tệp config.ru thay vì tệp môi trường. Một cái gì đó như,

require ::File.expand_path('../config/environment', __FILE__) 
# Middleware to gzip content 
use Rack::Deflater 
run MyApplication 

Bằng cách này, nó không ảnh hưởng đến nội dung đang được biên soạn và vẫn gzips nội dung đang được phân phối.

Bất kỳ tài nguyên nào về cách config.ru hoạt động và nơi Rack :: Deflater hiện đang cư trú rất được hoan nghênh.

+0

Điều này thật tuyệt, nhưng không phải là mát mẻ khi phân phát tệp .gz mà đường ống nội dung tạo ra. Tôi tự hỏi liệu có cách nào để làm điều đó không? – maletor

+1

Đây là [câu hỏi liên quan] (http://stackoverflow.com/questions/12326191/any-way-to-serve-gzip-assets-from-heroku) bạn có thể thấy hữu ích. –

5

Chỉ cần đứng đầu Rack::Deflateris already used by Rails 3.1 để bạn không cần phải thực hiện việc này theo cách thủ công.

NHƯNG, để trả lời vấn đề của bạn ở đây, tôi giả định rằng production.rb của bạn có số config.serve_static_assets = false được đặt.

các phần mềm trung gian ActionDispatch::Static chỉ được sử dụng khi serve_static_assets được đặt thành true. Heroku thực sự tiêm cấu hình này để ghi đè lên bất cứ điều gì bạn đặt anyway (xem thông báo nhật ký Injecting rails3_serve_static_assets khi bạn triển khai), nhưng tôi không chắc chắn ở giai đoạn nào trong triển khai điều này xảy ra.

Vì vậy, có khả năng bạn không bật phân phát nội dung tĩnh khi chạy assets:precompile (lưu ý đây chỉ là phỏng đoán, tôi không ở trên Rails 3.1 nhưng vì vậy tôi có thể là sai)

tôi muốn giới thiệu với gợi ý thêm nó bằng tay trong tập tin rackup bạn membLoper của:

  1. nó không cần thiết như đã giải thích ở trên
  2. middleware của bạn có liên quan đến ứng dụng của bạn thực sự nên được tiêm như ban đầu bạn đã thử trong số application.rb
+0

Điều đó dường như không đúng. Bạn có thể trỏ đến nguồn chính không? – maletor

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