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 :)