在生产模式中找不到rails-application.css资产

在生产模式中找不到rails-application.css资产,css,ruby-on-rails,ruby-on-rails-3,asset-pipeline,Css,Ruby On Rails,Ruby On Rails 3,Asset Pipeline,我正在升级一个应用程序以使用资产管道 我已经将css资产编译到一个应用程序css文件中,但是当我以生产模式运行应用程序时,没有找到它们 RAILS_ENV=production bundle exec rails s 我访问任何页面,从数据库中获得正确的输出,但没有样式,日志显示: ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c...f07c.css"): 即使该文件存在于

我正在升级一个应用程序以使用资产管道

我已经将css资产编译到一个应用程序css文件中,但是当我以生产模式运行应用程序时,没有找到它们

RAILS_ENV=production bundle exec rails s
我访问任何页面,从数据库中获得正确的输出,但没有样式,日志显示:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"):
即使该文件存在于公共/资产中

$ ls public/assets/def*
public/assets/default.scss-1a27c...f07c.css     public/assets/default.scss.css
public/assets/default.scss-1a27c...f07c.css.gz  public/assets/default.scss.css.gz
要让服务器找到资产文件,我需要更改什么

我的其他.css文件也是如此。它们被编译成带有指纹的公共/资产,但随后找不到

页面源显示:

<link href="/assets/default.scss-1a27c...f07c.css" 
media="screen" rel="stylesheet" type="text/css" />
application.rb具有

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

module Linker
  class Application < Rails::Application
    config.encoding = "utf-8"
    config.filter_parameters += [:password]
    config.assets.enabled = true
    config.assets.initialize_on_precompile = false # For Heroku
    config.assets.version = '1.0'
  end
end
这种情况似乎发生在所有资产上,例如

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"):
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"):
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"):
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"):
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500
ActionController::RoutingError (No route matches [GET] "/images/link.ico"):

当您执行
rake assets:precompile
时,您的资产将进入公共目录。查看是否可以在
public/assets/

您应该看到如下内容:

I, [2014-02-23T20:06:21.853314 #26915]  INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

默认情况下,Rails不服务于
public
下的资产。请参见您的
生产.rb

  config.serve_static_assets = true
把它变成真的,你就可以走了。(注意:您不希望在生产环境中设置为
true
,请记住在部署之前将其更改回原来的设置!)

有关详细信息,请参阅

在rails 6中,在默认的
production.rb中应该有一行

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
因此,使用

RAILS_SERVE_STATIC_FILES=true rails server -e production

或者在
production.rb
中设置
config.public\u file\u server.enabled=true
。有关rails 4和5,请参见下面的答案。

在rails 4中,您可以通过传递环境变量使它们在生产环境中显示(本地运行):

RAILS\u SERVE\u STATIC\u FILES=true RAILS server-e production

只要您在
/config/environments/production.rb
中有这一行,这应该可以工作:

  config.serve_static_assets = true

config.serve\u static\u files=ENV['RAILS\u serve\u static\u files']。是否提供?

RAILS 5解决方案与上面Jules Copeland给出的类似

在预生成的
config/environments/production.rb
文件中,应该有一个类似以下内容的条目:

I, [2014-02-23T20:06:21.853314 #26915]  INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
我在at中找到了关于此设置的合理解释:

config.public\u file\u server.enabled将Rails配置为服务于静态 公共目录中的文件。此选项默认为true,但在 生产环境设置为false,因为服务器 用于运行应用程序的软件(如NGINX或Apache)应 改为提供静态文件。如果您正在中运行或测试应用程序 使用WEBrick的生产模式(不建议在中使用WEBrick) 生产)将选项设置为true。否则,您将无法 使用页面缓存和请求公共目录下存在的文件 目录


结论:在生产环境中,使用
rails\u SERVE\u STATIC\u FILES=1启动rails服务器将允许rails像web服务器一样为public/assets目录中的任何文件提供服务。请记住,Rails是一个应用服务器,它的效率不如web服务器(如NGINX、Apache等)。对于真实世界的应用程序,您应该在Rails前面有一个专用的web服务器,该服务器将单独为静态资产服务,并且只在需要时为Rails提供动态内容。有关更多详细信息,请参阅Justin Weiss关于web服务器和应用程序服务器之间的差异。

您是否执行了
rake assets:precompile
是的,我执行了
$RAILS\u ENV=production bundle exec rake assets:precompile
并重新启动了我的服务器能否复制您的application.rb和production.rb文件?检查这个问题和答案,您在预编译时似乎有错误的名称,它将写入哪个目录?+1谢谢,它似乎在向公共/资产写入,至少指纹打印的文件在那里。新写入的文件名和请求的文件名匹配吗?我在问题中添加了更多来自公共/资产的输出。您是说文件存在,而您的web服务器没有呈现它吗?您的web服务器出现问题。不是栏杆。尝试手动访问该URL-
app/assets/application….css
为什么在生产中它应该是错误的?我正在使用rails\u 12factor和heroku。谢谢你的进一步解释@LeoBrown Rails假设在生产环境中,您有一个web服务器(Apache、nginx)在Rails之前运行,甚至有一个专门用于静态资产的CDN。对于Rails 5:在
config/environments/production.rb
@vmarquet中将
config.public_file_server.enabled
设置为
true
,我只是花了太多时间搜索这个答案。。。在生产模式下设计
将我带到这里,是为了那些不可避免地会跟随我的人。谢谢我要补充的是,在Rails 5中,配置标志是由ENV['Rails\u SERVE\u STATIC\u FILES']设置的。现在?
这意味着您可以使用
Rails\u SERVE\u STATIC\u FILES=1 Rails服务器运行您的服务器——环境生产
,而不必更改配置文件。