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:
//= require_tree .
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:
//= require_tree ./global
Paso 2: vaya a su archivo config / initializers / assets.rb y agregue lo siguiente:
%w( controllerone controllertwo controllerthree ).each do |controller|
Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.css"]
end
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]:
<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track': 'reload' %>
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 :
<%= javascript_include_tag "#{controller_name}/#{action_name}" if AppName::Application.assets.find_asset("#{controller_name}/#{action_name}") %>
config / initializers / assets.rb :
config.assets.precompile += %w(*/*)
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.