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

Posted

技术标签:

【中文标题】rails - 在生产模式下找不到 application.css 资产【英文标题】:rails - application.css asset not found in production mode 【发布时间】:2014-03-25 00:58:28 【问题描述】:

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

我已将 css 资产编译到应用程序 css 文件中,但当我在生产模式下运行应用程序时找不到它们

RAILS_ENV=production bundle exec rails s

并且我访问了任何页面,我从数据库中获得了正确的输出,但没有样式,并且日志显示:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"):

即使该文件存在于 public/assets 中

$ 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" />

rails (haml) 来源是= stylesheet_link_tag 'default.scss.css'

public.assets当前包含以下文件。

$ ls public/assets/def*
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz
public/assets/default.scss.css
public/assets/default.scss.css.gz

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

config/environments/production 有:

$ cat config/environments/production.rb 
Linker::Application.configure do
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css']
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.compile = false
  config.assets.digest = true
  config.log_level = :debug
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
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 是的,我做了$ RAILS_ENV=production bundle exec rake assets:precompile 并重新启动了我的服务器 你能复制你的 application.rb 和 production.rb 文件吗? 看看这个问题和答案,你似乎有错误的名字***.com/questions/7367864/… 【参考方案1】:

Rails 默认不提供public 下的资源。见你的production.rb:

  config.serve_static_assets = true

将其更改为 true,您就可以开始了。 (注意:您不希望在生产中使用 true,记得在部署之前将其改回!)

详情请见Configuring Rails Applications。

在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_file_server.enabled=true。请参阅下面有关轨道 4 和 5 的答案。

【讨论】:

为什么在生产中应该是假的?我正在使用 rails_12factor 和 heroku。感谢您的进一步解释! @LeoBrown Rails 假设在生产环境中,您有一个在 Rails 之前运行的 Web 服务器(Apache、nginx),甚至是专门用于静态资产的 CDN。其中任何一个都可以比 Rails 更快地提供静态资源。 对于 Rails 5:在 config/environments/production.rb 中将 config.public_file_server.enabled 设置为 true @vmarquet,我只是花了太多时间来寻找这个答案......在生产模式下设计&lt;%= link_to('Logout', destroy_user_session_path, method: :delete) %&gt; 将我带到这里,为那些不可避免地跟随的人。谢谢! 我想补充一点,在 Rails 5 中,配置标志由ENV['RAILS_SERVE_STATIC_FILES'].present? 设置,这意味着您可以使用RAILS_SERVE_STATIC_FILES=1 rails server --environment production 运行您的服务器,并且无需更改配置文件就可以了。 【参考方案2】:

Rails 5 的解决方案类似于上面 Jules Copeland 给出的Rails 4 solution。

在您预先生成的config/environments/production.rb 文件中,应该有一个类似这样的条目:

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

我在Configuring Rails Applications guidehttp://guides.rubyonrails.org 中找到了对此设置的正确解释:

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

结论:在生产环境中,使用RAILS_SERVE_STATIC_FILES=1 启动您的rails 服务器将允许Rails 提供public/assets 目录中的任何文件,就像Web 服务器一样。请记住,Rails 是一个应用服务器,它不会像 Web 服务器那样高效(例如 NGINX、Apache 等)。对于现实世界的应用程序,您应该在 Rails 前面有一个专用的 Web 服务器,它将自己提供静态资源,并且只在需要时打扰 Rails 的动态内容。有关更多详细信息,请参阅 Justin Weiss 的 this article,了解 Web 服务器和应用服务器之间的区别。

【讨论】:

【参考方案3】:

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

RAILS_SERVE_STATIC_FILES=true rails server -e production

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

config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?

【讨论】:

【参考方案4】:

当您执行rake assets:precompile 时,您的资产将进入公共目录。看看你能不能在public/assets/找到这些文件

你应该看到这样的东西:

I, [2014-02-23T20:06:21.853314 #26915]  INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css

【讨论】:

预编译时,会写入哪个目录? +1 谢谢,它似乎正在写入公共/资产,至少那是指纹文件所在的位置。 新写入的文件名和请求的文件名是否匹配? 我在问题中添加了来自公共/资产的更多输出。 您是说文件存在并且您的网络服务器没有呈现它吗?您的网络服务器有问题。不是导轨。尝试手动访问该 URL - app/assets/application....css

以上是关于rails - 在生产模式下找不到 application.css 资产的主要内容,如果未能解决你的问题,请参考以下文章

在发布模式下找不到基本窗口包括

Rails 不会在生产模式下加载我的图像资产

在调试模式下找不到此可执行文件的有效配置文件

Nightwatch测试在Headless chrome模式下找不到元素

Spark sql 在yarn-cluster模式下找不到表

recovery模式下找不到zip刷机包怎么办