2008-12-23 8 views
60

Dites que j'ai besoin d'appeler un fichier javascript dans le <head> d'un modèle ERb. Mon instinct est de faire l'habituel:Javascript Inclure la meilleure pratique d'étiquette dans une application Rails

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

dans la mise en page de mon application. Le problème est bien sûr que ces fichiers javascript soient chargés dans chaque page de mon application, qu'ils soient ou non nécessaires pour la page visualisée. Donc, ce que je me demande, c'est s'il y a un bon moyen de charger un javascript dans les en-têtes de, par exemple, tous les modèles ERb trouvés seulement dans un répertoire spécifique.

Répondre

110

J'utiliser content_for.

Par exemple, indiquez le lieu de l'insérer dans la mise en page de l'application:

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

et l'envoyer là-bas d'une vue:

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

vient de sauver ma journée. Merci! – AnApprentice

+1

Pourquoi le <% - au lieu de <% =? Est-ce une syntaxe spéciale? –

+2

Dans les anciennes versions de rails, "<% -" empêche erb de générer des espaces inutiles avant le <% tag. Cela se produit automatiquement avec les nouvelles versions – Gu1234

1

J'ai généralement les suivantes dans le fichier de mise en page:

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

Et puis la vue:

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

Voir la documentation de l'API pour #capture

6

Je me sens il n'y a rien de mal, y compris tous les défauts qui onts depuis ils peuvent ensuite être mis en cache sur le navigateur de l'utilisateur.

+11

qu'en est-il si vous avez inclus qui ne sont applicables qu'à la partie admin d'un site web? – Ali

3

Je suggère de ne pas ajouter javascript dans l'en-tête car il provoque le chargement de la page plus lente. Plutôt charger le js au bas de la page, ce qui est plus rapide. http://developer.yahoo.com/performance/rules.html#js_bottom

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

et l'envoyer là-bas d'une vue:

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