Rails 3 tiene un JavaScript discreto que es bastante bueno.
Pero me preguntaba cuál es la mejor manera de incluir JavaScript adicional para una página en particular.
Por ejemplo, donde podría haberlo hecho anteriormente:
<%= f.radio_button :rating, 'positive', :onclick => "$('some_div').show();" %>
Ahora podemos hacerlo discreto con algo como
<%= f.radio_button :rating, 'positive' %>
# then in some other file
$('user_rating_positive').click(function() {
$('some_div').show();
}
Entonces, ¿mi pregunta es dónde / cómo incluir ese JavaScript? No quiero llenar el application.js
archivo porque este JavaScript solo es aplicable a esta vista. ¿Debo incluir un archivo JavaScript personalizado para cada página de alguna manera, o pegarlo en una variable de instancia que busca el encabezado?
javascript
ruby-on-rails
ruby-on-rails-3
Brian Armstrong
fuente
fuente
Respuestas:
Lo que me gusta hacer es incluir el Javascript por vista en un
content_for :head
bloque y luegoyield
a ese bloque en el diseño de su aplicación. Por ejemploSi es bastante corto, entonces:
o, si es más largo, entonces:
Luego, en su archivo de diseño
fuente
<%= javascript_include_tag "my_javascipt_file" %>
?Si desea incluir javascript en una sola página, puede incluirlo en la página en línea, por supuesto, sin embargo, si desea agrupar su javascript y aprovechar la canalización de activos, mins js, etc., es posible hacerlo y tener más js activos que se combinan y solo se cargan en páginas específicas al dividir sus js en grupos que solo se aplican en ciertos controladores / vistas / secciones del sitio.
Mueva sus js en activos a carpetas, con un archivo de manifiesto separado para cada uno, por lo que si tenía una biblioteca admin js que solo se usa en el back-end, puede hacer esto:
en la aplicación existente.js
en un nuevo archivo de manifiesto admin.js
Asegúrese de que este nuevo manifiesto js se cargue editando config / production.rb
Luego, ajuste el diseño de su página para que pueda incluir algunos js adicionales para el encabezado de la página:
Luego, en las vistas donde desea incluir este grupo js específico (así como el grupo de aplicaciones normal) y / o cualquier js, css, etc., específicos de la página:
Por supuesto, puede hacer lo mismo con css y agruparlo de manera similar para aplicarlo solo a ciertas áreas del sitio.
fuente
//= require_tree ./global
, pero no si lo uso//= require_directory ./global
con Rails 3.2.12.¡Estas respuestas me ayudaron muchísimo! Si alguien quiere un poco más ...
application.js.coffee
entonces todos los javacsripts se cargarán cada vez que navegue a una página diferente, y se anulará el propósito de hacer javascripts específicos de la página.Por lo tanto, debe crear su propio archivo de manifiesto (por ejemplo
speciifc.js
) que requerirá todos los archivos de JavaScript específicos de la página. Además, modificarrequire_tree
desdeapplication.js
app / assets / javascripts / application.js
app / assets / javascripts / specific.js
Luego, al
environments/production.rb
agregar este manifiesto a la lista precompilada con la opción de configuración,config.assets.precompile += %w( specific.js )
¡Hecho! Todos los javascripts compartidos que siempre deben cargarse se colocarán en la
app/assets/javascripts/global
carpeta y los javascripts específicos de la páginaapp/assets/javascripts/specific
. Simplemente puede llamar a los javascripts específicos de la página desde la vista como<%= javascript_include_tag "specific/whatever.js" %>
//.js es opcional.Esto es suficiente, pero también quería utilizarlo
javascript_include_tag params[:controller]
. Cuando crea controladores, se genera un archivo coffeescript asociado alapp/assets/javascripts
igual que otras personas mencionadas. Realmente hay controladores específicos javascripts , que se cargan solo cuando el usuario alcanza la vista específica del controlador.Entonces creé otro manifiesto
controller-specific.js
app / assets / javascripts / controller-specific.js
//= require_directory .
Esto incluirá todos los coffeescripts generados automáticamente asociados con los controladores. Además, debe agregarlo a la lista precompilada.
config.assets.precompile += %w( specific.js controller-specific.js )
fuente
javascript_include_tag params[:controller]
? Actualmente mi application.html.erb tiene esta líneajavascript_include_tag 'application'
. ¿Debo reemplazar esto con la otra línea?<%= javascript_include_tag "specific/whatever.js" %>
en uncontent_for :header
bloque?config.assets.precompile
. ¿No está todoapp/assets/javascripts/*.js
precompilado automáticamente?application.css
yapplication.js
. Otros deben incluirse en otros archivos o enumerarse usandoconfig.assets.precompile
. Lea más aquíconfig.assets.precompile
yconfig.assets.version
se han trasladado a config / inicializadores / assets.rbPrefiero lo siguiente ...
En su archivo application_helper.rb
y luego en su vista particular (app / views / books / index.html.erb en este ejemplo)
... Parece funcionar para mi.
fuente
Si no desea utilizar la canalización de activos o las soluciones complejas para obtener ese JavaScript específico de la página necesaria (simpatizo), la forma más simple y robusta, que logra lo mismo que las respuestas anteriores pero con menos código es solo para utilizar:
Nota: esto requiere una solicitud http más por etiqueta de inclusión que las respuestas que usan
content_for :head
fuente
javascript_include_tag
fue exactamente lo que estaba buscando, aplausos AJP//= require .
en la aplicación.js?//= require .
traería ese script a cualquier página de su sitio, por lo que tendría que hacer algo como Kenny Grant (uso//= require_tree ./global
) o bjg sugerido.//= require_tree .
a//= require_directory .
application.js y luego creé un subdirectorio en assets \ javascripts. Tenga en cuenta que debe incluir el nuevo directorio en config \ initializers \ assets.rb para precompilar su js agregando la línea:Rails.application.config.assets.precompile += %w( new_dir/js_file.js )
Echa un vistazo a la gema pluggable_js . Puede encontrar esta solución más fácil de usar.
fuente
Tengo entendido que la canalización de activos está destinada a disminuir el tiempo de carga de la página al combinar todos sus js en un solo archivo (minificado). Si bien esto puede parecer repugnante en la superficie, en realidad es una característica que ya existe en lenguajes populares como C y Ruby. Cosas como las etiquetas "incluir" están destinadas a evitar la inclusión múltiple de un archivo y a ayudar a los programadores a organizar su código. Cuando escribe y compila un programa en C, todo ese código está presente en cada parte de su programa en ejecución, pero los métodos solo se cargan en la memoria cuando se usa ese código. En cierto sentido, un programa compilado no incluye nada para garantizar que el código sea muy modular. Hacemos que el código sea modular al escribir nuestros programas de esa manera, y el sistema operativo solo carga en la memoria los objetos y métodos que necesitamos para una localidad determinada. ¿Existe incluso algo así como la "inclusión específica del método"? Si su aplicación de rieles es tranquila, esto es esencialmente lo que está pidiendo.
Si escribe su javascript para que aumente el comportamiento de los elementos HTML en la página, entonces esas funciones son 'específicas de la página' por diseño. Si hay algún código complicado que escribió de tal manera que se ejecutará independientemente de su contexto, tal vez considere vincular ese código a un elemento html de todos modos (puede usar la etiqueta del cuerpo, como se describe en el método Garber-Irish ). Si una función se ejecuta condicionalmente, el rendimiento probablemente será menor que todas esas etiquetas de script adicionales.
Estoy pensando en usar la gema de paloma , como se describe en el proyecto de aplicaciones de rieles . Luego puede hacer que su página de JavaScript sea específica al incluir funciones específicas de la página en una devolución de llamada de paloma:
Usas rieles, así que sé que te encantan las gemas :)
fuente
No debería cargar sus archivos JS o CSS fuera de la canalización de activos porque pierde características importantes que hacen que Rails sea tan bueno. Y no necesitas otra gema. Creo en usar la menor cantidad de gemas posible, y usar una gema no es necesario aquí.
Lo que desea se conoce como "Javascript específico del controlador" ("Javascript específico de la acción se incluye en la parte inferior). Esto le permite cargar un archivo JavaScript específico para un CONTROLADOR específico. Intentar conectar su Javascript a una vista es una especie de ... hacia atrás y no sigue el patrón de diseño MVC. Desea asociarlo con sus Controladores o acciones dentro de sus Controladores.
Desafortunadamente, por cualquier razón, los desarrolladores de Rails decidieron que, por defecto, cada página cargará todos los archivos JS ubicados en su directorio de activos. Nunca sabré por qué decidieron hacer esto en lugar de habilitar el "Javascript específico del controlador" de forma predeterminada. Esto se realiza a través del archivo application.js, que incluye la siguiente línea de código de manera predeterminada:
Esto se conoce como una directiva . Es lo que utiliza Sprockets para cargar cada archivo JS en el directorio assets / javascripts. Por defecto, sprockets carga automáticamente application.js y application.css, y la directiva require_tree carga cada archivo JS y Coffee en sus respectivos directorios.
NOTA: Cuando andamia (si no está andamiando, ahora es un buen momento para comenzar), Rails genera automáticamente un archivo de café para usted, para el controlador de ese andamio. Si desea que genere un archivo JS estándar en lugar de un archivo de café , elimine la gema de café que está habilitada de forma predeterminada en su Gemfile , y su andamio creará archivos JS en su lugar.
Bien, entonces el primer paso para habilitar el "Javascript específico del controlador" es eliminar el código require_tree de su archivo application.js, O cambiarlo a una carpeta dentro de su directorio assets / javascripts si aún necesita archivos JS globales. ES DECIR:
Paso 2: vaya a su archivo config / initializers / assets.rb y agregue lo siguiente:
Inserte los nombres de controlador que desee.
Paso 3: Reemplace javascript_include_tag en su archivo application.html.erb con esto (tenga en cuenta la parte params [: controller]:
Reinicie su servidor y viola! El archivo JS que se generó con su andamio ahora solo se cargará cuando se llame a ese controlador.
¿Necesita cargar un archivo JS específico en una ACCIÓN específica en su controlador , IE / articles / new ? Haz esto en su lugar:
application.html.erb :
config / initializers / assets.rb :
Luego agregue una nueva carpeta con el mismo nombre que su controlador en su carpeta de activos / javascripts y coloque su archivo js con el mismo nombre que su acción dentro. Luego lo cargará en esa acción específica.
fuente
De acuerdo, tal vez este sea el peor trabajo posible, pero creo un método de controlador que acaba de generar el archivo .js
Controlador
Ver
si por alguna razón no queremos hacer esto, hágamelo saber.
fuente
La forma preferida de agregar JS es en el pie de página, por lo que puede hacerlo de esta manera:
show.html.erb:
layouts / application.html.erb
fuente