type tag specific script rails para page llamar insertar externo etiqueta desde archivo javascript jquery ruby-on-rails ruby unobtrusive-javascript

tag - rails mejores prácticas donde colocar javascript discreto



script type= text/javascript src= (3)

Mis aplicaciones de rieles (todas las 2.3.5) usan una mezcla total de javascript en línea, rjs, prototipo y jquery. Llamémoslo aprendizaje o dolores de crecimiento. Últimamente he estado cada vez más enamorado de javascript discreto. Hace que su html esté limpio, de la misma manera que css lo limpió.

Pero la mayoría de los ejemplos que he visto son pequeños ejemplos, y ponen todo javascript (jquery) dentro de application.js

Ahora tengo una aplicación bastante grande, y estoy pensando maneras de estructurar mi js. Me gusta de alguna manera que mi guión todavía esté cerca de la vista, así que estoy pensando algo así como

orders.html.erb orders.js

donde orders.js contiene el javascript discreto específico de esa vista. Pero tal vez sea solo que soy demasiado conservador :)

He leído algunas publicaciones de Yehuda Katz sobre este problema here y here , donde aborda este problema. Pasará por sus archivos js y solo cargará aquellos relevantes para su vista. Pero, por desgracia, no puedo encontrar una implementación actual.

Entonces mis preguntas:

  • ¿Cómo estructurar mejor su javascript discreto; administre su código, ¿cómo se asegura de que sea obvio a partir del código html qué se supone que debe hacer algo? Creo que los buenos nombres de clase van un largo camino :)
  • ¿cómo arreglas tus archivos, los cargas todos adentro? ¿sólo algunos? ¿utiliza content_for :script o javascript_include_tag en su vista para cargar los scripts relevantes? O ...?
  • ¿Escribes funciones muy genéricas (como una eliminación), con parámetros (¿añades atributos adicionales?), o escribes funciones muy específicas (¿SECO?). Sé que en Rails 3 hay un conjunto estándar, y todo es discreto allí. ¿Pero cómo comenzar en Rails 2.3.5?

En resumen: ¿cuáles son las mejores prácticas para hacer javascript discreto en los rieles? :)


Encontré esta publicación al intentar resolver el mismo problema, pero ninguna de las soluciones existentes me pareció la correcta. Escribí mi enfoque here. Me encanta la convención de Rails sobre la configuración, por lo que quería el mismo enfoque para incluir JavaScript que se apliquen solo a una página de acción en particular. Si nada más, es al menos otro enfoque para agregar a sus opciones.


No creo que haya una mejor práctica, pero le haré saber lo que hago.

  1. Tengo una serie de archivos js para cada uno con su propio propósito en el directorio public/javascripts/ . Algunos ejemplos podrían ser utility.js chat.js shopping_basket.js y así sucesivamente.

  2. Utilizo el empaquetador de activos y defino una gran colección para toda mi funcionalidad de uso general y otra para la funcionalidad solo de administración. Los viajes redondos al servidor cuestan demasiado. Básicamente, incluyo todos los js en la carga de la primera página minimizados en una burbuja (en general)

  3. $(document).ready ganchos básicos $(document).ready en línea en las páginas, y los mantengo muy cortos.

  4. Los datos a los que deben acceder mis archivos js se representan en línea con la página. (Generalmente en el DOM, a veces como vars - Por ejemplo, var xyz = 100 )

  5. Por lo general, desarrollaré mis controladores con javascript desactivado (y me aseguraré de que todo funcione), luego lo enciendo y rocío unos pocos if request.xhr? donde sea necesario

Tenga en cuenta que Rail 3.1 presenta una mejor práctica incorporada, consulte: http://guides.rubyonrails.org/asset_pipeline.html - en una nota personal, he tenido problemas de rendimiento y configuración con la nueva interconexión, sin embargo, muchos otros tienen Tuvo gran éxito con ello.


Recientemente documenté cómo he estado administrando javascript en Ruby on Rails . Básicamente descompongo las cosas en muchos archivos pequeños y granulares, cada uno con un espacio de nombres apropiado y luego los combino en un único archivo para la producción usando asset_packager.