Pregunta javascript_include_tag Rails 4 genera "/ javascripts /" en lugar de "/ assets" en producción


Tengo una aplicación de Rails 4 con

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

en la cabeza. En desarrollo, se procesa el siguiente HTML y se carga modernizr:

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

En producción, se procesa el texto siguiente, y modernizr es no cargado (404 no encontrado):

<script data-turbolinks-track="true" src="/javascripts/modernizr.js"></script>

En producción, /assets/modernizr.js es encontrado y navegable

los Documentación de rieles dice que el javascript_include_tag debería generar

<script data-turbolinks-track="true" src="/assets/modernizr.js?body=1"></script>

En producción, mi stylesheet_link_tags están bien, vinculando a la /assets/ directorio.

Porque es el javascript_include_tag enlazando a /javascripts en lugar de /assets en producción, y ¿cómo puedo solucionarlo?


32
2017-07-12 19:43


origen


Respuestas:


Una de las declaraciones de uso de AssetUrlHelper indica que producirá / javascripts / urls como lo que estás viendo:

# asset_path "aplicación", escriba:: javascript # => /javascripts/application.js

(de asset_url_helper.rb línea 117 - [1]

Este código parece que solo se puede alcanzar si falta el recurso precompilado por lo que parece que su compilación de activos no está funcionando (mis implementaciones usualmente fallar cuando eso suceda, entonces quizás el tuyo ni siquiera está disparando).

El mismo asset_url_helper.rb llama a / javascripts / part 'extname' y utiliza el siguiente mapa para saber cómo generar el nombre:

 # Maps asset types to public directory.
  ASSET_PUBLIC_DIRECTORIES = {
    audio:      '/audios',
    font:       '/fonts',
    image:      '/images',
    javascript: '/javascripts',
    stylesheet: '/stylesheets',
    video:      '/videos'
  }

Una nueva aplicación de Rails 4 tiene esto en config / environments / production.rb

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

que parece coincidir con el comportamiento que estás viendo.


21
2017-10-06 23:17



Por defecto, Rails solo precompila application.js, application.css y cualquier imagen que encuentre en la ruta de los activos. Por lo tanto, en producción mordernizr no se compilará previamente y, por lo tanto, los ayudantes de javascript no podrán encontrar el archivo.

Para solucionar el problema, puede agregar modernizr a la lista de precompilación modificando la siguiente configuración en production.rb

config.assets.precompile += ['modernizr.js']

Para más información, ver las guías de rieles


12
2018-02-11 01:36



Asegúrese de precompilar sus activos en producción ejecutando este comando:

RAILS_ENV=production bundle exec rake assets:precompile

La Guía de Rails en la cartera de activos puede brindarle más detalles: http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets


4
2017-08-06 19:32



Tengo una nueva aplicación que usa Rails 4 desplegada en Heroku con:

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

mi aplicación javascript. (huella digital) .js llamada desde src: assets / application.js

Creo que su problema proviene de algo en su producción. rb que define los activos desde otra ubicación.

Así que tal vez puedas agregar Moderniz.js a

config.assets.precompile = ['.js ','.css ',' * .css.erb ']

en config / production.rb

O simplemente requiere una secuencia de comandos modernizr en su application.js

// = require mordernizr

y elimine la llamada de script modernizr en su diseño.

<%= javascript_include_tag "modernizr", "data-turbolinks-track" => true %>

¿Puede verificar desde dónde se sirve su application.js en su entorno de producción?


1
2017-10-01 12:51



Puede ser porque este archivo debe estar en / vendor / assets / javascript en lugar de / app / assets / javascript. La carpeta del proveedor es para las bibliotecas de JavaScript, y la carpeta de la aplicación es para su código.

Una solución mejor que agregar una etiqueta a su diseño sería agregar una referencia de script a su application.js y permitir que el compilador sass lo comprima y lo adjunte a su archivo javascript principal.

Si no obtiene una respuesta definitiva, consulte: http://guides.rubyonrails.org/asset_pipeline.html#asset-organization


-1
2017-08-06 18:47