2013-06-06 10 views
16

Rails 3.2.13 ve Rails Asset Pipeline kullanıyorum. Varlık Boru Hattı'nı kullanmak istiyorum, böylece varlıklarım için SASS ve CoffeeScript ve ERB'yi kullanabilirim ve Boru Hattı bunları otomatik olarak derlemeli, böylece boru hattını geliştirme aşamasında kapatamıyorum. Gelişimdeki varlıkları hiç hazırlamıyorum ve public/assets/ dizini bile yok. I kendisi de dahil olmak üzere (bu örnekte layout.html.erb olarak), dişlisi gelmez yaparak dosya değiştirmeden, bir layout.html.erb dosyasında (işlenmiş) dahil böyle bir _partial.html.erb dosyasına olarak dahil edilen dosyada değişiklik yapmak AncakGeliştirme için Sprockets öğe önbelleğini devre dışı bırakma

' Değişikliği algılayıp önbelleği geçersiz kılar, bu yüzden aynı eski dosyayı almaya devam ediyorum. Bunu aktif geliştirmede yaptığımda, her istekte değişiklik yapabilmem için varlıkları önbelleğe almayı devre dışı bırakmak istiyorum, ancak bunu nasıl yapacağımı anlayamıyorum. Ben benim development.rb içinde aşağıdakilerden tüm belirledik:

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 

Yine bu bile, dosyalar tmp/cache/assets/ ve tmp/cache/sass/ altında görünür ve değişikliklerin gelecek istekler üzerinde kullanılamaz. Şu anda, bir değişikliği görmek istediğimde bu dizinleri manuel olarak silmem gerekiyor.

Maalesef Varlık Boru Hattı RoR Kılavuz How Caching Works bölümünün tüm içeriği ise:

Sprocketler geliştirme ve üretimde önbellek varlıklara varsayılan Raylar önbellek deposu kullanır.

TODO: Varsayılan mağazayı değiştirme hakkında daha fazla bilgi edinin.

Peki, Sprockets'ları varlıkları isteğe göre değil, sonuçları önbelleğe almak için nasıl derlerim?

cevap

26

İşte sihirli büyü var:

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

varlık boru hattı bir önbellek kendi örneği var sahiptir ve ayar config.assets.cache = false hiçbir şey yapmaz, bu yüzden devre dışı bırakmak için null_store olma önbelleği ayarlamak gerekir.

O zaman bile SASS derleyicinin kendi önbelleği vardır ve bunu devre dışı bırakmanız gerekirse, onu ayrı ayrı devre dışı bırakmanız gerekir.

+0

:

çözüm sadece dişliler önbelleği geçersiz gerektiğini bilir, öyle ki bu tür bağımlılık ilan gereğidir. :-) Çalıştığınıza sevindim… –

+0

Bu, eylem önbellekleme mantığını test etmeye çalışırken dosya deposu önbelleğini açıp kapatmamı kesinlikle öldürüyordu. (gerçek önbelleğe alma parçası olmadan). Teşekkür ederim. – CrazyVipa

+0

Çalışmıyor – Benj

1

Sadece bunu yapan ve benim için çalışmanın tek yolu olduğunu belirten aşağıdaki özü oluşturdum (https://gist.github.com/metaskills/9028312).

# 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

önbellek sorunu burada da aynı, bir tarayıcı önbellek sıfırlama ile çalıştı – brauliobo

0

Kabul edilen yanıt doğru şekilde yapmıyor ve önbelleği tamamen devre dışı bırakarak geliştirmedeki performansı düşürüyor. Özgün sorunuzu yanıtlarken, doğrudan dahil edilmese bile öğe önbelleğini geçersiz kılmak için başvurulan dosyalarda değişiklik yapmak istersiniz. Tamamen garip

# 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