the rails present not images asset ruby-on-rails asset-pipeline

ruby on rails - present - La aplicación Rails no sirve a los activos en el entorno de producción



the asset is not present in the asset pipeline rails 5 (7)

Mi aplicación funciona bien cuando se ejecuta en un entorno de desarrollo. En producción ( rails server -e production ), el navegador no puede acceder a los archivos css y js y en la consola hay mensajes como:

I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000 F, [2013-07-27T21:00:59.108302 #11449] FATAL -- : ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"):

La sección principal de la fuente html en el entorno de producción:

<head> <title>a Social Server</title> <link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet"> <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> <script data-turbolinks-track="true" src="/javascripts/application.js"></script> <meta content="authenticity_token" name="csrf-param"> <meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> </head>

En desarrollo, por otro lado, la sección de cabeza se parece a:

<head> <title>a Social Server</title> <link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/bootstrap.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/fontawesome.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/bootstrap_and_overrides.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/instagram.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/socialserver.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.core.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.theme.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.accordion.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.menu.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.autocomplete.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.button.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.datepicker.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.resizable.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.dialog.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.progressbar.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.selectable.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.slider.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.spinner.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.tabs.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.tooltip.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.base.css?body=1" media="all" rel="stylesheet"> <link data-turbolinks-track="true" href="/assets/jquery.ui.all.css?body=1" media="all" rel="stylesheet"> <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> <script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-transition.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-alert.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-modal.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-dropdown.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-scrollspy.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tab.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tooltip.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-popover.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-button.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-collapse.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-carousel.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-typeahead.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-affix.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/twitter/bootstrap.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.widget.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.accordion.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.position.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.menu.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.autocomplete.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.button.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.mouse.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.draggable.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.resizable.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.dialog.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.droppable.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-blind.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-bounce.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-clip.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-drop.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-explode.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fade.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fold.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-highlight.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-pulsate.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-scale.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-shake.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-slide.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.effect-transfer.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.progressbar.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.selectable.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.slider.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.sortable.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.spinner.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.tabs.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.tooltip.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/jquery.ui.all.js?body=1"></script> <script data-turbolinks-track="true" src="/assets/application.js?body=1"></script> <meta content="authenticity_token" name="csrf-param"> <meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> </head>

La aplicación no utiliza una base de datos, por lo que he desactivado ActiveRecord. Fragmentos de los archivos de configuración:

aplicacion.rb

require File.expand_path(''../boot'', __FILE__) #require ''rails/all'' require "action_controller/railtie" require "action_mailer/railtie" require "rails/test_unit/railtie" require "sprockets/railtie" Bundler.require(:default, Rails.env) module Socialserver class Application < Rails::Application end end

producción.rb

Socialserver::Application.configure do config.cache_classes = true config.eager_load = true config.consider_all_requests_local = false config.action_controller.perform_caching = true config.serve_static_assets = false config.assets.js_compressor = :uglifier config.assets.compile = false config.assets.digest = true config.assets.version = ''1.0'' config.log_level = :info config.i18n.fallbacks = true config.active_support.deprecation = :notify config.log_formatter = ::Logger::Formatter.new config.assets.paths << Rails.root.join(''app'', ''assets'', ''fonts'') config.assets.precompile += %w( .svg .eot .woff .ttf ) end

desarrollo.rb:

Socialserver::Application.configure do config.cache_classes = false config.eager_load = false config.consider_all_requests_local = true config.action_controller.perform_caching = false config.action_mailer.raise_delivery_errors = false config.active_support.deprecation = :log config.assets.debug = true end

Gemfile:

source ''https://rubygems.org'' gem ''rails'', ''4.0.0'' gem ''sass-rails'', ''~> 4.0.0'' gem ''uglifier'', ''>= 1.3.0'' gem ''coffee-rails'', ''~> 4.0.0'' gem ''jquery-rails'' gem ''jquery-ui-rails'' gem ''turbolinks'' gem ''jbuilder'', ''~> 1.2'' group :doc do gem ''sdoc'', require: false end group :twitter do gem ''twitter'', ''4.8.1'' end group :instagram do gem ''instagram'', ''0.10.0'' end group :tumblr do gem ''tumblr_client'' end gem ''twitter-bootstrap-rails'' gem ''therubyracer'' #needed for runtime js on amazon ec2.

Me disculpo por publicar tanta información. Sentí que la información podría ser relevante.

ps sólo tengo conocimiento a medias de rieles, así que tengan paciencia conmigo. Gracias ~


Al probar localmente su entorno de producción, debe compilar los activos localmente. Simplemente ejecute el comando a continuación:

RAILS_ENV=production bundle exec rake assets:precompile

Se generarán todos los activos public/assets .

A continuación, tienes que decirle a Rails que sirva a los propios activos. El software del servidor (p. Ej., Nginx o Apache) lo hace por usted en entornos como Heroku, pero a nivel local, debe dejar que Rails lo haga. Cambia esto en tu production.rb .

config.serve_static_assets = true

¡Pero asegúrese de volver a establecerlo en false antes de poner su código en producción!


Busque un archivo como este:

public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json

Si está enviando activos precompilados a un servidor de producción, existe la posibilidad de evitar que se inserten archivos de "puntos" ocultos y este archivo esencial no entrará en producción.

En mi entorno necesito precompilar los activos en un entorno de integración y llevarlos a producción para que no haya necesidad de compilar los activos en la máquina de producción. Estaba bloqueando erróneamente que todos los archivos ocultos fueran empujados a la máquina de producción.

Para ver si esta respuesta funciona para usted, verifique el origen HTML generado en un navegador desde el servidor de producción para ver si se ha generado la ruta de los activos. Si ves tu etiqueta de script como esta:

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

Compruebe el atributo src. Debería comenzar con /assets/javascript . En este caso, comienza con /javascript que indica que Rails no cree que ninguno de los activos haya sido precompilado.

Corrigí esto actualizando mi inserción a producción (actualmente rsync), asegurando que .sprockets-manifest* el .sprockets-manifest* después de precompilar en mi servidor de integración.

Además, uso el Pasajero independiente como mi servidor de prueba de integración, en lugar de Webrick, ya que maneja el servicio más realista de archivos estáticos.


Como se indicó anteriormente, config.serve_static_assets está en desuso y es reemplazado por config.serve_static_files . Si uno examina config/environments/production.rb para Rails-4.2, entonces encuentra esto:

# Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.serve_static_files = ENV[''RAILS_SERVE_STATIC_FILES''].present?

La implicación es que configurar y exportar (en BASH) la variable de entorno export RAILS_SERVE_STATIC_FILES="to any value whatsoever" en una sesión antes de ejecutar rails s -e production dará el resultado deseado al realizar pruebas locales y también evitará tener que recordar recode production.rb antes de presionar al host de producción.


Creo que para Rails 4.x tiene que precompilar los activos para la producción o usar config.assets.compile incluso si es necesario.

El comportamiento predeterminado de Rails para el entorno de producción es "No retroceder al flujo de activos si se pierde un activo precompilado". Entonces, no lo hagas Utilizar para no compi

config.assets.compile = false

Si usa esta opción no necesita usar:

config.serve_static_files = true

Porque si el activo no fue precompilado, Rails compilará antes de la solicitud de servicio.

Pero si precompila los activos antes de la producción, no necesita config.assets.compile = true , pero necesita config.serve_static_files = true para que Rails atienda las solicitudes si no tiene http_server para servir los activos precompilados.

La configuración config.serve_static_assets está en desuso.

DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly.

Espero que esta respuesta te ayude (al lector) a comprender lo que realmente sucede.


El siguiente comando funciona para mí a nivel local.

rails server -e production

Recibí el mismo error "ActionController :: RoutingError (Ninguna ruta coincide con [GET]" /assets/application.css "" al ejecutar "rails s". Incluso después de precompilar la fuente, cambie la configuración de la precompilación verdadera. Aún no se pudo cargar correctamente.

La opción "-e producción" hizo que esos RoutingError desaparecieran.


En production.rb cambiar la configuración:

rieles 3.x

config.serve_static_assets = true

rieles 4.x

config.serve_static_files = true


Esto suena como para el problema que estaba teniendo .

Encontré un blog que sugiere que esto es un error en la canalización de activos de Rails 4.0.0, y es inexplicablemente mitigado por la configuración ...

config.assets.compile = true

... en config/environments/production.rb

Aparte de patear de alguna manera el flujo de activos para que realmente funcione, esa configuración activará la compilación en vivo de los activos. Eso suele ser algo malo para el rendimiento en producción, pero si aún precompila manualmente los activos cuando implementa, con

rake assets:precompile

... la compilación en vivo nunca debería ocurrir (porque los activos necesarios ya han sido precompilados).

Espero que esto ayude :)