2011-04-08 12 views
9

Probando cosas nuevas en Ruby: en cada página hago cosas muy ricas con jquery. Obviamente, si pongo todo el jquery en application.js, crecerá muy rápido.¿Cuál es una buena forma de implementar JavaScript por página en Rails?

¿Es un buen enfoque cargar un archivo js específico de la página al final? por ejemplo:

<script> 

$(document).ready(function() { 

    $.getScript("/javascripts/this_pages_scripts.js"); 

}); 
</script> 

¿Hay alguna manera de hacerlo? Conozco los archivos new.js.erb etc. y ujs, pero todavía estoy hablando de más js específicos de la página: arrastres y soltar inicializadores, creadores de diálogos, etc.

Muchas gracias.

+1

Cuando dice "grande muy rápido", es posible que exagere. 20-30 KB de JavaScript es mucho, pero no es "grande" porque se puede enviar al navegador comprimido a aproximadamente 3 KB y se almacenará en caché entre las solicitudes si el servidor está configurado correctamente. Solo las bibliotecas más grandes como jQuery-UI o Google Maps deberían preocuparle, y no cargarlas en páginas que no las usan puede ayudar. – tadman

Respuesta

11

Hay dos maneras que utilizo:

Para pequeños scripts, triviales que se acaba de añadir un poco de ojos dulces, a menudo me incluyo en línea en la plantilla que modifican (al igual que usted ha mostrado) , porque es más fácil para mí hacer un seguimiento de esta manera.

Para cualquier cosa que sea más de una o dos pequeñas líneas lo guardo discreto, pero cargarlo utilizando content_for

Mi diseño de la aplicación es el siguiente (en HAML):

= javascript_include_tag 'jquery.144.min','rails','jquery.tools','application' 
= yield :scripts 

La parte importante es yield :scripts. Luego, en una página en la que necesito algo de JavaScript que hago:

- content_for :scripts do 
    = javascript_include_tag 'photo_form' 

Esto carga el código JavaScript en el encabezado, pero sólo si se muestra la plantilla dada. content_for envía cosas al método yield con el nombre correspondiente.

Puede pegar un bloque de rendimiento como ese en cualquier lugar - También tengo uno justo antes de la etiqueta de cuerpo de cierre. El rendimiento/content_for es realmente útil.

Nota: como señaló tadman en los comentarios, cualquier cosa que no tenga que cargarse en la cabeza debe cargarse al final de la página.

Una última cosa a tener en cuenta, si tienes algo más complejo también puedes usar variables de instancia entre tus plantillas y la vista de tu aplicación. Por ejemplo, tengo una barra de menú en mi aplicación que está en el diseño de la aplicación. Por lo tanto, a veces quiero activar un botón específico del contexto o una fila adicional de botones solo en ciertas páginas.

En mi diseño de la aplicación que llamo un parcial que hace que el menú, el código de menú se parece a:

#menubar (normal menu stuff) 
    - if @special_menu 
    #special_menu 

Por lo tanto, a continuación, en cualquier plantilla que puede hacer:

- @special_menu = true 

... y para esa página aparecerá el menú dado. También puede hacer esto en acciones de controlador, tengo un controlador donde agregué un filtro anterior que establece uno de los indicadores de menú en verdadero. Podrías hacer lo mismo con cualquier conjunto complejo de cosas de JavaScript que quieras incluir condicionalmente.

mayoría de estas ideas que recibí de ver este Railscast: http://railscasts.com/episodes/30-pretty-page-title

debería echar un vistazo!

+0

Siempre que sea posible, los archivos JavaScript deben cargarse muy tarde en el documento para evitar que retrasen el procesamiento de la página. Los análisis deberían ser lo último antes de que se cierre la etiqueta '', por ejemplo. jQuery necesita cargarse temprano, al igual que cualquier otra cosa que use '$ (document) .ready (...)' por razones obvias. – tadman

+0

Buenos consejos Tadman, gracias! – Andrew

0

un juego de símbolos para representar el nombre del archivo en el encabezado y lo llaman en el controlador

@script = "prototype" 

A continuación, en la vista:

<%= javascript_include_tag @script %> 

O para cargar múltiples

@scripts = ["prototype", "dropdown"] 

Entonces

<% @scripts.each do |s| %> 
    <%= javascript_include_tag s %> 
<% end &> 
+0

Luego simplemente haga que sea diferente en cada controlador –

+0

Esto realmente no responde la mayor parte de la pregunta sobre cuál es la convención de Rails para estructurar su javascript entre los archivos. Y, por cierto, puede usar el operador splat para expandir una matriz a los argumentos a la 'js =% w {foo bar}; javascript_include_tag * js'. – coreyward

0

Yo personalmente uso requireJS y una biblioteca de detección de características personalizadas para manejar esto.

Luego tengo una sola línea para incluir el script requirejs y su atributo data-main en mi página de diseño/principal/vista compartida. (No estoy familiarizado con los rieles como tal, pero es lo mismo con cualquier otro MVC).

He escrito una buena respuesta sobre esto en otro lugar. Es posible que puedas encontrarlo.

Cuestiones relacionadas