2012-06-24 17 views
6

Tamam, bu çok derili uygulama uygulamasını Rails 3.1'de tanıtılan varlıklar boru hattından yararlanmak için dönüştürdüm. Çoğunlukla şaşırtıcı derecede kolay ve CSS/JS dosyalarınızda inline Ruby kullanmanıza izin veren önişleme yeteneğine aşığım. Ancak, Sprockets'in gücünün çözülmesi zor görünmesine rağmen, büyük bir sorunla karşılaştım. Uygulamam çalışma zamanında seçilen herhangi bir sayıdaki skins (veya "kimlikler") ile çalıştırılabilir. Bu "kimlik" parametresi, önbellek dizini, veritabanı bağlantısı, görünüm yolları ve gerçekten varlık yolları gibi şeyler ayarlar. Tüm "kimlikler" kendi stil sayfasına sahip olsa da, tüm örneklerde kullanılan bir paylaşımlı da vardır. /app/assets/stylesheets/aplication.css.erb olarakRaylar varlık borusu - varlık yolunda olmayan varlık nasıl dahil edilir?

: Yani varlıklar klasör yapısı şuna benzer

<% require_asset("shared.css") %> 
<% require_asset("overrides.css") %> 

Bu iki stil yükler ve en önemlisi de çözmek için yapılandırılmış varlık yolları kullanır Onları (bu yüzden, çözümleyiciye vurmadığı için standart require ve include yönergeleri yerine require_assets kullanıyorum). Bulunan ilk eşleşmeleri döndürür ve varsayılan stilin bir kısmını veya tamamını çok kolay bir şekilde geçersiz kılmamı sağlar. Yani

/app/assets/stylesheets/shared.css 

örneği varlıkları klasörüne

/app/assets/[identity]/stylesheets/shared.css 

aynı isimde bir dosya koyarak geçersiz kılınabilir ve böyle bir dosya varsa onu sessizce varsayılan shared.css düşer.

Her şey mükemmel bir şekilde çalışıyor - Javascriptler, resimler ve yazı tipleri için aynı tekniği kullanıyorum ve her şey ön işlem sırasında düzgün bir şekilde işleniyor ve paketleniyor. FAKAT. Elde edemediğim bir tür (yanal) kalıtım var;

varlıklar: Bir kimlik için cilt yalnızca birkaç dosen hatları farklılık başka birine kadar benzer bazen(örn özdeş düzeni ancak farklı renk düzeni ile) ve gerçekten böyle bir şey yapmak mümkün istiyor /stylesheets/application.css.erb:

<% require_asset("shared.css") %> 
<% require_asset("overrides.css") %> 

varlıklar/current_identity/stil/overrides.css:

<% require_asset("../../some_other_identity/stylesheets/overrides.css") %> 
/* followed by the dosen or so lines that differ for this skin */ 
... 

akım bağlamı "some_other_identity" varlık yolunda olmadığı için bu BAŞARISIZ s - Rails dosyayı dev modda bulamaz ve precompilation sırasında da dahil edilmez. Ve eğer varlık yoluna dahil edersem yanlış overrides.css yükler (sadece bir tane olabilir). Bu yüzden overrides.css üstündeki böyle bir şey koyarak deneme oldum: beklendiği gibi çalışıyor aslında

<%= File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css")) %> 
/* rest of CSS */ 
... 

Ve. FAKAT. Artık tüm varlıkları sunmak için varlıkları boru hattını kullanıyorum çünkü artık CSS'deki resimleri sabit bir yolla referanslayamıyorum - <%= asset_path("some_image.png") %> kullanmam gerekiyor, böylece yol çözücüsü büyüsünü çalışabilir. Bu benim overrides.css'un gerçekten overrides.css.erb olduğunu ve File.read() yaptığınızda ERB ön işlemenin gerçekleşmediği anlamına gelir. Yani sıkıştım! Yardım et! Kimse?

Düzenleme:

<%= ERB.new(File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb"))).result %> 

o ERB ayrıştırmak için denemek Kullanmak ama

undefined method `asset_path' for main:Object 

alırsanız tabii hangi dosya I asset_path("some_image.png") vb kullanarak bana kaynaklanmaktadır dahil etmeye çalışıyorum.

+0

Belki de .erb uzantısını 'File.read() 'e ekleyerek düşünebilirim. CSS dosya ismi onu çözer (aynı zamanda bir .erb dosyası olan bir dosyaya dahil edildiğinden) ama asla bu kadar basit değil mi? –

+0

Ve 'render()' işlevini kullanmak mümkün değil - [bu soruya bakın] (http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –

cevap

5

Tamam, arama saatlerinden sonra ben the list of available helper methods in Sprockets geldi - Bana GitHub üzerinde the Sprockets man page bağlantısı yapıldığı zaman çok fazla zaman kazandıracaktı (bir bağlantı var, ancak # FIXME'yi işaret ediyor). Çarklar API Dokümanlar:

  • (Object) evaluate(path, options = {})
  • path okur ve dosya üzerinde işlemcileri çalışır.
  • Bu, bir öğenin sonucunu yakalamanıza ve doğrudan diğerine eklemenize olanak tanır.
  • <%= evaluate "bar.js" %>

Bingo! Ben benim için yönergesi dahil değiştirdi:

<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %> 

ve CSS işlenmiş ve sonuçları sadece yol ben çalışmak istedim, takılı alır.

+0

Teşekkürler referans için bana yardımcı oldu. –