2008-12-23 7 views
60

Powiedz, że muszę wywołać plik javascript w <head> szablonu ERb. Instynkt jest zrobić to zwykle:JavaScript Dołącz najlepszą praktykę w aplikacji Railsowej

<head> 
<%= javascript_include_tag :defaults %> <!-- For example --> 
</head> 

w układzie mojego aplikacji. Problem oczywiście staje się, że te pliki javascript są ładowane na każdą stronę w mojej aplikacji, niezależnie od tego, czy są one potrzebne dla przeglądanej strony.

Zastanawiam się, czy istnieje dobry sposób na załadowanie javascripta do nagłówków, na przykład wszystkich szablonów ERB znalezionych tylko w określonym katalogu.

Odpowiedz

110

użyłbym content_for.

Na przykład, należy określić miejsce, aby wstawić go w układzie aplikacji:

<head> 
<title>Merry Christmas!</title> 
<%= yield(:head) -%> 
</head> 

i wysłać go tam z myślą:

<%- content_for(:head) do -%> 
<%= javascript_include_tag :defaults -%> 
<%- end -%> 
+0

prostu uratował mi dzień. Dzięki! – AnApprentice

+1

Dlaczego <% - zamiast <% =? Czy to jest jakaś specjalna składnia? –

+2

W starszych wersjach szyn "<% -" zapobiega generowaniu przez erb niepotrzebnych spacji przed znacznikiem <%. Dzieje się to automatycznie z nowszymi wersjami – Gu1234

1

I zazwyczaj mają następujące w pliku layoutu:

<head> 
    <%= javascript_include_tag :defaults %> <!-- For example --> 
    <%= @extra_head_content %> 
</head> 

a następnie w widokach:

<% (@extra_head_content ||= "") += capture do %> 
    <%= other_content %> 
<% end %> 

znaleźć w dokumentacji API dla #capture

6

czuję nie ma nic złego w tym wszystkie domyślne yr od czasu mogą być następnie buforowane w przeglądarce użytkownika.

+11

co, jeśli masz włączone, które mają zastosowanie tylko do części administracyjnej strony internetowej? – Ali

3

Sugerowałbym, aby nie dodawać javascript w nagłówku, ponieważ powoduje wolniej załadować stronę. Zamiast tego należy załadować js na dole strony, co jest szybsze. http://developer.yahoo.com/performance/rules.html#js_bottom

<body> 
.... 
    <%= yield(:js) -%> 
</body> 

i wysłać go tam z myślą:

<%- content_for(:js) do -%> 
    <%= javascript_include_tag :defaults -%> 
<%- end -%>