Nie powinieneś ładować plików JS lub CSS poza potokiem zasobów, ponieważ tracisz ważne funkcje, które sprawiają, że Railsy są tak świetne. I nie potrzebujesz kolejnego klejnotu. Wierzę w użycie jak najmniejszej liczby klejnotów, a używanie klejnotu nie jest tutaj konieczne.
To, co chcesz, jest znane jako „JavaScript specyficzny dla kontrolera” („JavaScript specyficzny dla akcji znajduje się na dole). Umożliwia to załadowanie określonego pliku JavaScript dla konkretnego KONTROLERA. Próba połączenia skryptu JavaScript z widokiem jest trochę… . do tyłu i nie jest zgodne ze wzorcem projektowym MVC. Chcesz powiązać go z kontrolerami lub akcjami wewnątrz kontrolerów.
Niestety, z jakiegoś powodu, twórcy Rails zdecydowali, że domyślnie każda strona załaduje każdy plik JS znajdujący się w katalogu zasobów. Nigdy się nie dowiem, dlaczego zdecydowali się to zrobić zamiast domyślnie włączać „JavaScript specyficzny dla kontrolera”. Odbywa się to za pośrednictwem pliku application.js, który domyślnie zawiera następujący wiersz kodu:
//= require_tree .
Jest to znane jako dyrektywa . To jest to, czego używa sprockets do załadowania każdego pliku JS w katalogu asset / javascripts. Domyślnie sprockets automatycznie ładuje application.js i application.css, a dyrektywa require_tree ładuje każdy plik JS i Coffee w odpowiednich katalogach.
UWAGA: Kiedy rusztujesz (jeśli nie budujesz rusztowania, teraz jest dobry moment na rozpoczęcie), Railsy automatycznie generują dla ciebie plik kawy dla kontrolera tego rusztowania. Jeśli chcesz, aby generował standardowy plik JS zamiast pliku kawy , usuń klejnot kawy, który jest domyślnie włączony w twoim Gemfile , a twoje rusztowanie utworzy zamiast tego pliki JS.
Ok, więc pierwszym krokiem do włączenia „JavaScript specyficznego dla kontrolera” jest usunięcie kodu require_tree z pliku application.js LUB zmiana go na folder w katalogu asset / javascripts, jeśli nadal potrzebujesz globalnych plików JS. TO ZNACZY:
//= require_tree ./global
Krok 2: przejdź do pliku config / initializers / asset.rb i dodaj następujące informacje:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
Wstaw żądane nazwy kontrolerów.
Krok 3: Zastąp javascript_include_tag w pliku application.html.erb tym (zwróć uwagę na część params [: controller]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
Uruchom ponownie serwer i altówkę! Plik JS, który został wygenerowany za pomocą twojego rusztowania, będzie teraz ładowany tylko wtedy, gdy zostanie wywołany ten kontroler.
Chcesz załadować określony plik JS na konkretną AKCJĘ w kontrolerze , IE / artykuły / nowy ? Zrób to zamiast tego:
application.html.erb :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializers / asset.rb :
config.assets.precompile += %w(*/*)
Następnie dodaj nowy folder o tej samej nazwie, co kontroler w folderze asset / javascripts i umieść w nim plik js o tej samej nazwie, co twoja akcja. Następnie załaduje go do tej konkretnej akcji.