Estoy actualizando una plantilla de Rails a v.7 y me encuentro con un desafío al actualizar las llamadas dinámicas para cargar varios Javascript y hojas de estilo basadas en el controlador/acción.
<%= javascript_include_tag controller_name if ::Rails.application.assets.find_asset(controller_name) %>funciona bien como se esperaba. Este código carga un archivo Javascript en la canalización de activos si el archivo existe, basándose únicamente en el controlador actual.
Sin embargo, cuando trato de acceder al mismo controlador con una acción dependiente, obtengo un
The asset "static/landing.js" is not present in the asset pipeline.
error con el siguiente código:
<%= javascript_include_tag("#{controller_name}/#{action_name}") if ::Rails.application.assets.find_asset("#{controller_name}/#{action_name}") %> El archivo en cuestión no existe, pero se supone que el código enumerado lo detecta si no es así y no genera la llamada javascript_include_tag si el archivo no existe en el árbol app/assets/javascripts .
¿Algunas ideas?
Ok, entonces la respuesta resultó ser simple pero un poco difícil de alcanzar; Aquí vamos...
Desde Rails 4, ha podido eliminar la designación de tipo de archivo .js desde el final de la referencia y Rails la recogió a través de la canalización de activos. Después de un serio examen de conciencia y ofrendas de cafeína a los dioses de la codificación, lo volví a intentar para restablecer mi refactorización... y funcionó.
Aquí está el código final que va en mi archivo application.html.erb :
<%= javascript_include_tag 'application', 'data-turbo-track': 'reload' %> <%= javascript_include_tag ("#{controller_name}"), 'data-turbo-track': 'reload' if ::Rails.application.assets.find_asset("#{controller_name}.js") %> <%= javascript_include_tag ("#{controller_name}/#{action_name}"), 'data-turbo-track': 'reload' if ::Rails.application.assets.find_asset("#{controller_name}/#{action_name}.js") %>La misma sintaxis también funciona para las hojas de estilo, así que no dude en copiarla si necesita hojas de estilo dinámicas.
Lo que hace este bloque de código es permitirle minimizar el contenido del archivo application.js(.erb) al mínimo. Descubrí que en el pasado, el mío tendía a estar bastante hinchado, de ahí mi búsqueda de algo más dinámico y adaptable. Ahora puedo agregar un archivo de hoja de estilo/Javascript para cada controlador y acción secundaria si necesito abordar algo específico sin preocuparme de que las ruedas dentadas se llenen de código innecesario o no utilizado, pero se degrada muy bien si no he necesitado crear los archivos. .
NOTA: Todavía no he evaluado esto, pero espero que proporcione un buen impulso de rendimiento.