2011-09-15 11 views
21

Aby zachować specyficzną dla kontrolera logikę JavaScript poza standardową wersją application.js i mieć ją tylko kontroler, umieszczam go w osobnym pliku .js i dołączam to na podstawie nazwy kontrolera z układem takie jak:Strategia Rails 3.1 do wstępnego kompilowania specyficznych dla kontrolera zasobów JS

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

to działa dobrze, ale gdy wdrożyć aplikację do produkcji (używam Capistrano i posiada pre kompilacji zadanie utworzenia), przy czym Potok zasobów nie prekompiluje żadnego ze specyficznych dla kontrolera plików JS. Zakładam, że dzieje się tak dlatego, że mój aktualny plik JavaScript nie jest przywoływany przez wymagające dyrektywy w pliku application.js.

Jak sobie z tym poradzić bez przenoszenia sterownika JS z powrotem do aplikacji application.js, lub jawnie odwołując się do niego z pliku application.js?

Czy jest jakiś sposób, aby powiedzieć potoku aktywów, aby wstępnie skompilować dodatkowe pliki list? Jak mogę ręcznie skompilować konkretny plik podczas produkcji?

Aktualizacja

jak to turns out można określić poszczególne pliki tutaj w swoim config/environments/production.rb:

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

... lub po prostu poszedł do przodu i kapryśnie dodania go do każdego pliku JavaScript:

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

to powinno być naprawdę automatyczne! –

+3

Warto zauważyć, że dodanie plików scss/coffee do listy precomile NIE DZIAŁA! (I nie rzucajcie też błędu!). Musisz podać tylko nazwę z rozszerzeniem .js/css. –

Odpowiedz

4

Oto, co robię:

Struktura

katalogu:

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

aplikacji sessions.js tylko posiada:

*= require_self 
*= require_tree ./sessions 

Następnie w widoku, czy

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

FYI, @current_controller = controller_name w moim application_controller Metody .rb, wywoływane za pomocą filtru before_filter.

+0

To wygląda na rozwiązanie, chociaż trochę bardziej skomplikowane niż w mojej aktualizacji. Mam nadzieję, że nie ma niezamierzonych skutków ubocznych mojego rozwiązania. –

+0

Myślę, że twoja droga jest w porządku. Ten, który wymienię, pozwoli ci tylko uwzględnić pliki js, które chcesz, w zależności od "obszaru" twojego kodu. W ten sposób nie ładujesz więcej, niż to konieczne. – jschorr

5

Myślę, że ty i james_schorr tak naprawdę nie mówicie o tym samym. Musisz dodać pliki inne niż application.js do config.assets.precompile. Jego odpowiedź była bardziej na temat struktury katalogu, którą możesz/powinnaś przyjąć, jeśli się nie mylę.

Gdybym chciał mieć kontroler specyficzny, chciałbym zrobić:

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

I na przykład, users.js byłoby:

*= require_tree ./users 

ten sposób można utrzymać porządek (mają dużo pliki js na kontroler), ale w prod, wszystkie będą zawarte w jednym pliku.

Wciąż trzeba, że ​​w config:

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

Mam ten sam problem tutaj, jest to ból głowy dla mnie.

W tym * .js jest trochę za dużo, nie chcę, aby wszystkie pliki były kompilowane w oddzielne pliki, niektóre z nich mają być połączone.

Mój pomysł polega na przechowywaniu określonych plików kontrolera w podkatalogu, takim jak "kontrolery", a następnie dołączanie tylko plików kontrolerów/* .js lub css do prekompilacji.

Nie jestem pewien, czy to działa, czy nie, wypróbuję to, w każdym razie, może to być przydatna wskazówka.

7

Jeśli chcesz precompile js | css tylko znaleźć się w katalogu głównym aktywów/JavaSkrypty i aktywów/stylesheets katalogów (a nie ich drzewo hierarchii), można umieścić to w plikach środowiska:

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 
Powiązane problemy