Ruby on rails Rails应用程序不服务于生产环境中的资产

Ruby on rails Rails应用程序不服务于生产环境中的资产,ruby-on-rails,asset-pipeline,Ruby On Rails,Asset Pipeline,我的应用程序在开发环境中运行时运行良好。在产品(rails server-e产品)中,浏览器无法访问css和js文件,并且在控制台上有如下消息: 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]

我的应用程序在开发环境中运行时运行良好。在产品(
rails server-e产品
)中,浏览器无法访问css和js文件,并且在控制台上有如下消息:

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"):
在生产环境中时,html源的标题部分:

<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>
档案:

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.
我很抱歉发布了这么多信息。我觉得这些信息可能是相关的


p、 在美国,我对rails的了解还不全面,所以请容忍我。谢谢~

在production.rb中更改设置:

rails 3.x

config.serve_static_assets = true
rails 4.x

config.serve_static_files = true

在本地测试生产环境时,必须在本地编译资产。只需运行以下命令:

RAILS_ENV=production bundle exec rake assets:precompile
它将生成
public/assets
下的所有资产

接下来,您必须告诉Rails为资产本身提供服务。服务器软件(如Nginx或Apache)可以在Heroku这样的环境中为您做这件事,但在本地,您应该让Rails来做。在您的
production.rb中更改此选项:

config.serve_static_assets = true
但在将代码推送到生产环境之前,请确保将其设置回
false

这听上去像是在说

我发现了一个提示这是Rails 4.0.0资产管道中的一个bug,通过设置

config.assets.compile = true
。。。在
config/environments/production.rb中

除了以某种方式将资产管道引入实际工作之外,该设置还将启用资产的实时编译。这通常对生产中的性能是一件坏事,但如果在部署时仍然手动预编译资产,则

rake assets:precompile
。。。实时编译不应该发生(因为必要的资产已经预编译)


我希望这有帮助:)

以下命令在本地对我有效

rails server -e production
在运行“rails s”时,我遇到了相同的错误“ActionController::RoutingError(没有与[GET]“/assets/application.css”匹配的路由)。即使在预编译源代码之后,也要更改config precompile true。它仍然无法正确加载


选项“-e production”使这些RoutingError消失。

我认为对于Rails 4.x,您必须将资产预编译到production或使用config.assets.compile,即使需要也可以

生产环境的默认Rails行为是“如果缺少预编译的资源,则不要回退到资源管道。”因此,不要。 习惯于不compi

config.assets.compile = false
如果使用此选项,则不需要使用:

config.serve_static_files = true
因为如果资产没有预编译,Rails将在服务请求之前编译

但是,如果您在生产之前预编译了资产,那么您不需要
config.assets.compile=true
,但是如果您没有http\u服务器来服务预编译的资产,您需要
config.service\u static\u files=true
来为请求提供Rails服务

不推荐使用设置
config.service\u static\u assets

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.

我希望这个答案能帮助你(读者)理解真正发生的事情

检查这样一个文件:

public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>
如果要将预编译的资产推送到生产服务器,则有可能会阻止推送到隐藏的“点”文件,而此基本文件将无法进入生产

在我的环境中,我需要在集成环境中预编译资产并将其推送到生产环境中,这样就不需要在生产机器上编译资产。我错误地阻止了所有隐藏文件被推送到生产机器中

若要查看此答案是否适用于您,请从生产服务器在浏览器中检查生成的HTML源,以查看是否已生成资产路径。如果您看到脚本标记,如下所示:

public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json
<script data-turbolinks-track="true" src="/javascripts/application.js"></script>

检查src属性。它应该以
/assets/javascript
开头。在这种情况下,它以
/javascript
开头,这表明Rails不认为任何资产已经预编译

我通过更新push to production(当前为rsync)来纠正这一问题,确保在集成服务器上预编译后推送
.sprockets manifest*
文件


另外,我使用standalone Passenger作为我的集成测试服务器,而不是Webrick,因为它处理更现实的静态文件服务。

如前所述
config.serve\u static\u assets
已被弃用,取而代之的是
config.serve\u static\u files
Rails-4.2然后我们会发现:

  # 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?

这意味着设置和导出(在BASH中)环境变量
export RAILS\u SERVE\u STATIC\u FILES=“到任何值”
在运行
rails s-e production之前的会话中,将在本地测试时提供所需的结果,也将避免在推送到生产主机之前必须记住重新编码
production.rb

在rails 5.x中,设置为

config/initializers/assets.rb:

Rails.application.config.public_file_server.enabled = true

我正在尝试自己在ec2机器上部署此应用程序。在ec2上,我安装了ruby、rails,然后进行了“rails服务器-e生产”。因此,我想简单地告诉rails服务器命令env是production不会导致它编译资产?顺便说一句,如果我在production.rb中设置config.assets.compile=true,事情会再次正常工作。那么,如果你想自己部署应用程序,最好的方法是什么?如果我使用unicorn而不是webrick,这会有什么不同吗?告诉Rails环境是生产环境,实际上并不编译资产。您需要在本地预编译它们。您可能想看看这篇文章,它展示了如何使用gem asset\u sync将资产推送到S3和Cloudfront:If
服务器软件(例如Nginx或Apache)为我做这件事。在我的理解中,这意味着在服务器端,它被设置为
TRUE
config.service\u static\u assets=TRUE
),但为什么我要在将其推送到服务器之前将其设置回
FALSE
  # 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?
Rails.application.config.public_file_server.enabled = true