2011-09-15 21 views
21

Denetleyiciye özel JavaScript mantığını standart application.js'den uzak tutmak ve yalnızca ilgili denetleyici tarafından dahil edilmesini sağlamak için, bunu kendi .js dosyasına koyarım ve denetleyici adına göre aşağıdaki gibi bir düzen ekleyerek dahil ederim:Rails 3.1, kontrolöre özgü JS varlıklarını önceden derlemek için strateji

<%= javascript_include_tag "application", params[:controller] %> 

Çok iyi çalışıyor, ancak uygulamayı prodüksiyona dağıttığımda (Capistrano kullanıyorum ve bir ön derleme görevi kurdum), varlık boru hattı denetleyiciye özgü JS dosyalarından herhangi birini önceden oluşturmuyor . Bunun nedeni, benim gerçek JavaScript dosyamın application.js dosyasındaki yönergeler gerektirmediğinden kaynaklanmış olduğunu varsayıyorum.

Denetleyiciye özgü JS'yi uygulama.js'ye geri döndürmeden veya açıkça application.js'den başvurmaksızın bununla nasıl baş edebilirim?

Ek liste dosyalarını önceden derlemek için varlık boru hattını anlamanın bir yolu var mı? Üretimde belirli bir dosyayı manuel olarak nasıl önceden derleyebilirim?

turns out olarak, config/environments/production.rb

config.assets.precompile += %w(achievements.js) 

config.assets.precompile += %w(*.js) 
+2

bu gerçekten otomatik olmalı! –

+3

Burada önkoşul listesine scss/kahve dosyalarını ekleyerek işe yaramayacaktır. (Ve hata da atmayın!). Sadece .js/css uzantısıyla adlandırmanız gerekir. –

cevap

4

Yaptığım şey şu:

dizin yapısı:

app/assets/javascripts/sessions/multiple.js 
app/assets/application-sessions.js 

uygulama sessions.js sadece vardır: senin görünümünde Sonra

*= require_self 
*= require_tree ./sessions 

, benim application_controller içinde

<% if @current_controller == 'whatever' %> 
    <%= javascript_include_tag "application-sessions" %> 
<% else %> 
    …. 
<% end %> 

Bilginize, @current_controller = controller_name yapmak Bir before_filter ile adlandırılan .rb yöntemleri.

+0

Güncellememde bittiğinden biraz daha karmaşık olmasına rağmen bir çözüm gibi görünüyor. Umarım çözümümde istenmeyen yan etkileri yoktur. –

+0

Bence yolun iyi. Listelediğim, yalnızca kodunuzun "alanına" bağlı olarak istediğiniz js dosyalarını eklemenize izin verecektir. Bu şekilde, gerekli olandan daha fazla yüklemiyorsun. – jschorr

5

Sen ve james_schorr gerçekten aynı şey bahsetmiyoruz düşünüyorum. Sen application.js config.assets.precompile dışındaki dosyaları eklemek gerekir. Cevabı yanılmadıysam, benimseyebileceğin/yapması gereken dizin yapısı hakkındaydı. Belirli denetleyici olmasını isteseydim

, ben yapardım:

/assets 
    /javascripts 
     /users 
      login.js 
      profile.js 
     /blogs 
     /posts 
     users.js 
     blogs.js 
     posts.js 

Ve mesela

, users.js olacaktır:

*= require_tree ./users 

, organize kalabilir O yolu (çok bir var denetleyici başına js dosyaları), ancak prod olarak, hepsi tek bir dosyada yer alacaktır.

Hala config olduğunu gerekir: Burada aynı sorunu yaşıyorum

config.assets.precompile += %w(*.js) 
0

, benim için bir baş ağrısı.

Dahil * .js biraz fazladır, her dosyanın ayrı dosyalar halinde derlenmesini istemiyorum, bazıları bir araya getirilmiş olduğunu varsayalım.

Fikrim, denetleyiciye özgü dosyaları "denetleyiciler" gibi bir alt dizine depolayın ve sonra ön denetleme için yalnızca denetleyicileri/*. Js veya css dosyalarını dahil edin.

Çalıştığından emin olup olmadığından emin değilim, yine de deneyeceğim, yararlı bir ipucu olabilir. Eğer js derleme istiyorsanız

7

| css sadece varlıkları/JavaScripts ve varlık/stil dizinleri kökünde bulunan (ve onların ağaç hiyerarşisi), sen çevre dosyalarında bu koyabilirsiniz:

Dir.chdir "#{Rails.root}/app/assets/javascripts" 
    a = Dir.glob("*.{js,coffee,erb}") 
    Dir.chdir "#{Rails.root}/app/assets/stylesheets" 
    b = Dir.glob("*.{css,erb}") 
    config.assets.precompile += a.concat(b) 
    Dir.chdir Rails.root 
İlgili konular