2013-06-06 41 views
16

Tôi đang sử dụng Rails 3.2.13 và Đường dẫn tài sản Rails. Tôi muốn sử dụng đường ống Asset Pipeline vì vậy tôi có thể sử dụng SASS và CoffeeScript và ERB cho tài sản của mình và có Pipeline tự động biên dịch chúng, vì vậy tôi không thể tắt đường ống trong quá trình phát triển. Tôi không biên dịch trước tài sản trong quá trình phát triển bao giờ và thậm chí không có thư mục public/assets/.Vô hiệu hóa bộ nhớ đệm tài sản Sprockets trong quá trình phát triển

Tuy nhiên, khi tôi thay đổi một tập tin bao gồm, chẳng hạn như vào một tập tin _partial.html.erb được bao gồm (render) trong một file layout.html.erb, mà không thay đổi các tập tin làm bao gồm cả bản thân (trong ví dụ này layout.html.erb), Bánh răng doesn' t phát hiện sự thay đổi và làm mất hiệu lực bộ nhớ cache, vì vậy tôi tiếp tục nhận được cùng một tập tin cũ. Khi tôi làm điều này trong phát triển tích cực, tôi muốn vô hiệu hóa bất kỳ bộ nhớ đệm nào của tài sản để tôi có thể nhận được các thay đổi trên mọi yêu cầu nhưng tôi không thể tìm ra cách thực hiện việc này. Tôi đã đặt tất cả những điều sau đây trong development.rb tôi:

config.action_controller.perform_caching = false 
config.action_dispatch.rack_cache = nil 
config.middleware.delete Rack::Cache 
config.assets.debug = true 
config.assets.compress = false 
config.cache_classes = false 

Tuy nhiên, ngay cả với điều này, tập tin hiển thị dưới tmp/cache/assets/tmp/cache/sass/ và những thay đổi không có sẵn trên các yêu cầu trong tương lai. Ngay bây giờ tôi phải tự xóa các thư mục đó mỗi lần tôi muốn thấy thay đổi.

Thật không may, toàn bộ nội dung của phần How Caching Works của Hướng dẫn ROR cho đường ống Asset là:

Bánh răng sử dụng các cửa hàng bộ nhớ cache mặc định Rails để tài sản trong bộ nhớ cache phát triển và sản xuất.

TODO: Thêm thông tin thêm về cách thay đổi cửa hàng mặc định.

Vì vậy, làm cách nào tôi có thể lấy Sprockets để biên dịch nội dung theo yêu cầu nhưng không lưu vào bộ nhớ cache kết quả?

Trả lời

26

Đây là câu thần chú kỳ diệu:

config.assets.cache_store = :null_store # Disables the Asset cache 
config.sass.cache = false # Disable the SASS compiler cache 

Đường ống dẫn dầu tài sản có đó là ví dụ của riêng của một bộ nhớ cache và thiết config.assets.cache = false không có gì, vì vậy bạn phải thiết lập bộ nhớ cache của nó là null_store để vô hiệu hóa nó.

Thậm chí sau đó, trình biên dịch SASS có bộ nhớ cache riêng và nếu bạn cần tắt nó, bạn phải vô hiệu hóa riêng biệt.

+0

Đó là hoàn toàn xa lạ. :-) Rất vui khi bạn làm việc đó ... –

+0

Điều này đã hoàn toàn giết chết tôi phải bật và tắt bộ nhớ cache lưu trữ tệp khi cố gắng kiểm tra bộ nhớ đệm của hành động. (không có bộ nhớ đệm thực tế). Cảm ơn bạn. – CrazyVipa

+0

Điều này không hoạt động – Benj

1

Tôi tạo ra gist sau đây (https://gist.github.com/metaskills/9028312) mà chỉ cần điều này và thấy nó là cách duy nhất mà làm việc cho tôi.

# In config/initializers/sprockets.rb 

require 'sprockets' 
require 'sprockets/server' 

Sprockets::Server.class_eval do 

    private 

    def headers_with_rails_env_check(*args) 
    headers_without_rails_env_check(*args).tap do |headers| 
     if Rails.env.development? 
     headers["Cache-Control"] = "no-cache" 
     headers.delete "Last-Modified" 
     headers.delete "ETag" 
     end 
    end 
    end 
    alias_method_chain :headers, :rails_env_check 

end 
+0

vấn đề bộ nhớ cache giống nhau ở đây quá, làm việc với một bộ nhớ cache trình duyệt thiết lập lại – brauliobo

0

Câu trả lời được chấp nhận không làm việc đó một cách chính xác và nó làm giảm hiệu suất trong phát triển bằng cách tắt bộ nhớ cache hoàn toàn. Trả lời câu hỏi ban đầu của bạn, bạn muốn thay đổi các tệp được tham chiếu để làm mất hiệu lực bộ nhớ cache nội dung ngay cả khi không được bao gồm trực tiếp.

Giải pháp là đơn giản bằng cách tuyên bố sự phụ thuộc như vậy mà sprockets biết rằng bộ nhớ cache nên không còn giá trị:

# layout.html.erb 
<% depend_on Rails.root.join('app').join('views').join('_partial.html.erb') %> 
# replace the above with the correct path, could also be relative but didn't try