Rails 3 ma trochę dyskretnego JavaScript, który jest całkiem fajny.
Ale zastanawiałem się, jak najlepiej jest dołączyć dodatkowy JavaScript do konkretnej strony.
Na przykład tam, gdzie mogłem wcześniej:
<%= f.radio_button :rating, 'positive', :onclick => "$('some_div').show();" %>
Teraz możemy sprawić, że będzie dyskretny za pomocą czegoś takiego jak
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Więc myślę, że moje pytanie brzmi: gdzie / jak dołączyć ten JavaScript? Nie chcę wypełniać application.js
pliku, ponieważ ten JavaScript ma zastosowanie tylko do tego jednego widoku. Czy powinienem jakoś dołączyć niestandardowy plik JavaScript dla każdej strony, czy też umieścić go w zmiennej instancji, której szuka nagłówek?
javascript
ruby-on-rails
ruby-on-rails-3
Brian Armstrong
źródło
źródło
Odpowiedzi:
To, co lubię, to dołączanie kodu JavaScript per-view do
content_for :head
bloku, a następnieyield
do tego bloku w układzie aplikacji. Na przykładJeśli jest dość krótki, to:
lub, jeśli dłużej, to:
Następnie w pliku układu
źródło
<%= javascript_include_tag "my_javascipt_file" %>
?Jeśli chcesz umieścić javascript tylko na jednej stronie, możesz oczywiście dołączyć go na stronie w tekście, jednak jeśli chcesz zgrupować swój javascript i skorzystać z potoku zasobów, zminimalizowanego js itp., Możesz to zrobić i mieć dodatkowe js, które są łączone i ładowane tylko na określonych stronach, dzieląc js na grupy, które mają zastosowanie tylko w niektórych kontrolerach / widokach / sekcjach witryny.
Przenieś pliki js w zasobach do folderów, z osobnym plikiem manifestu dla każdego, więc jeśli masz bibliotekę admin js, która jest używana tylko na zapleczu, możesz zrobić to:
w istniejącym pliku application.js
w nowym pliku manifestu admin.js.
Upewnij się, że nowy manifest js został załadowany, edytując plik config / production.rb
Następnie dostosuj układ strony, aby można było dołączyć dodatkowe pliki js dla nagłówka strony:
Następnie w widokach, w których chcesz uwzględnić tę konkretną grupę js (a także normalną grupę aplikacji) i / lub dowolne pliki js, css itp. Dotyczące strony:
Możesz oczywiście zrobić to samo z css i zgrupować go w podobny sposób, aby zastosować tylko do niektórych obszarów witryny.
źródło
//= require_tree ./global
, ale nie, jeśli używam//= require_directory ./global
Rails 3.2.12.Te odpowiedzi bardzo mi pomogły! Jeśli ktoś chce trochę więcej ...
application.js.coffee
tego momentu, wszystkie javacsripts będą ładowane za każdym razem, gdy przejdziesz do innej strony, a cel wykonywania skryptów javascript specyficznych dla strony zostanie pokonany.Dlatego musisz utworzyć własny plik manifestu (np.
speciifc.js
), Który będzie wymagał wszystkich plików javascript specyficznych dla strony. Modyfikuj takżerequire_tree
zapplication.js
aplikacja / asset / javascripts / application.js
aplikacja / asset / javascripts / specific.js
Następnie
environments/production.rb
dodaj ten manifest do prekompilowanej listy z opcją config,config.assets.precompile += %w( specific.js )
Gotowe! Wszystkie udostępnione
app/assets/javascripts/global
skrypty JavaScript, które powinny być zawsze ładowane, zostaną umieszczone w folderze, a skrypty związane ze stroną wapp/assets/javascripts/specific
. Możesz po prostu wywołać skrypty JavaScript specyficzne dla strony z widoku, takiego jak<%= javascript_include_tag "specific/whatever.js" %>
//.js jest opcjonalny.To wystarczy, ale chciałem też z tego skorzystać
javascript_include_tag params[:controller]
. Podczas tworzenia kontrolerów powiązany plik coffeescript jest generowany wapp/assets/javascripts
taki sam sposób, jak wspomniane inne osoby. Istnieją naprawdę specyficzne dla kontrolera JavaScript, które są ładowane tylko wtedy, gdy użytkownik osiągnie określony widok kontrolera.Więc stworzyłem kolejny manifest
controller-specific.js
app / asset / javascripts / controller-specific.js
//= require_directory .
Obejmuje to wszystkie automatycznie generowane skrypty kawowe powiązane z kontrolerami. Musisz także dodać go do wstępnie skompilowanej listy.
config.assets.precompile += %w( specific.js controller-specific.js )
źródło
javascript_include_tag params[:controller]
. Obecnie moja application.html.erb ma tę linięjavascript_include_tag 'application'
. Czy powinienem zastąpić to inną linią?<%= javascript_include_tag "specific/whatever.js" %>
wcontent_for :header
bloku?config.assets.precompile
. Czy wszystko wapp/assets/javascripts/*.js
prekompilacji nie jest automatycznie?application.css
iapplication.js
. Inne muszą być zawarte w innych plikach lub wymienione za pomocąconfig.assets.precompile
. Czytaj więcej tutajconfig.assets.precompile
iconfig.assets.version
przeszedłem do config / initializers / asset.rbWolę następujące ...
W pliku application_helper.rb
a następnie w Twoim konkretnym widoku (w tym przykładzie app / views / books / index.html.erb)
... wydaje się działać dla mnie.
źródło
Jeśli nie chcesz używać potoku zasobów lub skomplikowanych obejść, aby uzyskać ten niezbędny skrypt javascript specyficzny dla strony (sympatyzuję), najprostszym i najbardziej niezawodnym sposobem, który daje to samo, co powyższe odpowiedzi, ale przy mniejszej ilości kodu, jest po prostu posługiwać się:
Uwaga: wymaga to jednego żądania http więcej na tag include niż odpowiedzi, które używają
content_for :head
źródło
javascript_include_tag
był dokładnie tym, czego szukałem, pozdrawiam AJP//= require .
application.js?//= require .
spowodowałoby przeniesienie tego skryptu na dowolną stronę w witrynie, więc musiałbyś zrobić coś takiego, jak Kenny Grant (użyj//= require_tree ./global
) lub zasugerowany przez bjg.//= require_tree .
na//= require_directory .
application.js, a następnie utworzyłem podkatalog w asset \ javascripts. Zauważ, że musisz dołączyć nowy katalog do config \ initializers \ asset.rb, aby wstępnie skompilować plik js, dodając wiersz:Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
Spójrz na gem pluggable_js . Może się okazać, że to rozwiązanie jest łatwiejsze w użyciu.
źródło
Rozumiem, że potok zasobów ma na celu skrócenie czasu ładowania strony poprzez połączenie wszystkich plików js w jeden (zminimalizowany) plik. Choć z pozoru może się to wydawać odrażające, w rzeczywistości jest to funkcja, która już istnieje w popularnych językach, takich jak C i Ruby. Znaczniki typu „include” mają na celu zapobieganie wielokrotnemu dołączaniu pliku i pomaganie programistom w organizowaniu ich kodu. Kiedy piszesz i kompilujesz program w C, cały ten kod jest obecny w każdej części uruchomionego programu, ale metody są ładowane do pamięci tylko wtedy, gdy ten kod jest używany. W pewnym sensie skompilowany program nie zawiera niczego, co mogłoby zagwarantować, że kod jest ładnie modułowy. Tworzymy kod modułowy, pisząc w ten sposób nasze programy, a system operacyjny ładuje do pamięci tylko te obiekty i metody, których potrzebujemy dla danej lokalizacji. Czy istnieje coś takiego jak „włączenie specyficzne dla metody”? Jeśli Twoja aplikacja rails działa uspokajająco, zasadniczo o to prosisz.
Jeśli piszesz swój skrypt javascript tak, aby zwiększał zachowanie elementów HTML na stronie, to te funkcje są „specyficzne dla strony” z założenia. Jeśli istnieje jakiś skomplikowany kod, który napisałeś w taki sposób, że będzie wykonywał się niezależnie od kontekstu, może i tak rozważ powiązanie tego kodu z elementem html (możesz użyć tagu body, jak opisano w metodzie Garber-Irish ). Jeśli funkcja jest wykonywana warunkowo, wydajność prawdopodobnie będzie mniejsza niż wszystkie te dodatkowe znaczniki skryptu.
Myślę o użyciu klejnotu Paloma , zgodnie z opisem w projekcie Rails Apps . Następnie możesz ustawić swoją stronę javascript specyficznie, włączając funkcje specyficzne dla strony w wywołaniu zwrotnym Paloma:
Używasz szyn, więc wiem, że kochasz klejnoty :)
źródło
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:
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:
Krok 2: przejdź do pliku config / initializers / asset.rb i dodaj następujące informacje:
Wstaw żądane nazwy kontrolerów.
Krok 3: Zastąp javascript_include_tag w pliku application.html.erb tym (zwróć uwagę na część params [: controller]:
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 :
config / initializers / asset.rb :
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.
źródło
Ok, więc może to najgorsza praca na świecie, ale stworzyłem metodę kontrolera, która właśnie wyrenderowała plik .js
Kontroler
Widok
jeśli z jakiegoś powodu nie chcemy tego robić, daj mi znać.
źródło
Preferowanym sposobem dodawania JS jest stopka, więc możesz to zrobić w ten sposób:
show.html.erb:
layouts / application.html.erb
źródło