升级Ruby 2.0.0至3.3.6及Rails 8.0.0后静态资源加载失败求助
问题:Rails 8.0.0 + Ruby 3.3.6 升级后静态资源加载失败及jQuery UI文件找不到
已完成的升级操作
- 创建
app/assets/config/manifest.js,初始内容:
(后续已更新该文件内容)//= link_tree ../images //= link_directory ../javascripts .js //= link_directory ../stylesheets .css - 将gem依赖从
turbolinks替换为turbo-rails,修改application.html.erb标签,把data-turbolinks.track改为data-turbo-track:<head> <title>Numbe Accounting</title> <%= stylesheet_link_tag :application, media: 'all', "data-turbo-track": "reload", defer: true %> <%= javascript_include_tag :application, "data-turbo-track": "reload", defer: true %> <%= csrf_meta_tags %> </head>
遇到的问题
1. 静态资源路由错误(生产环境)
服务器启动正常,但CSS、JS、图片无法加载,production.log报错:
ActionController::RoutingError (No route matches [GET] "/stylesheets/application.css"): I, [2025-01-24T15:27:51.990551 #117291] INFO -- : Started GET "/javascripts/application.js" for 192.168.131.150 at 2025-01-24 15:27:51 +0200 F, [2025-01-24T15:27:51.991099 #117291] FATAL -- : ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"): I, [2025-01-24T15:27:52.016920 #117291] INFO -- : Started GET "/images/numbe_accounting.jpg" for 192.168.131.150 at 2025-01-24 15:27:52 +0200 F, [2025-01-24T15:27:52.017929 #117291] FATAL -- : ActionController::RoutingError (No route matches [GET] "/images/numbe_accounting.jpg"):
添加sprockets依赖后,错误仍存在。
2. jQuery UI 文件找不到(开发环境)
开发环境运行时报错:
Information for cause: Sprockets::FileNotFound (couldn't find file 'jquery.ui.tabs' with type 'text/css' Checked in these paths: /var/local/www/numbe_accounting/app/assets/config /var/local/www/numbe_accounting/app/assets/images /var/local/www/numbe_accounting/app/assets/javascripts /var/local/www/numbe_accounting/app/assets/stylesheets /var/local/www/numbe_accounting/vendor/assets/javascripts /var/local/www/numbe_accounting/vendor/assets/stylesheets /home/deploy/.rvm/gems/ruby-3.3.6/gems/turbo-rails-2.0.11/app/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/underscore-rails-1.8.3/vendor/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/jquery-ui-rails-7.0.0/app/assets/images /home/deploy/.rvm/gems/ruby-3.3.6/gems/jquery-ui-rails-7.0.0/app/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/jquery-ui-rails-7.0.0/app/assets/stylesheets /home/deploy/.rvm/gems/ruby-3.3.6/gems/jquery-rails-4.6.0/vendor/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/coffee-rails-5.0.0/lib/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/actiontext-8.0.1/app/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/actiontext-8.0.1/app/assets/stylesheets /home/deploy/.rvm/gems/ruby-3.3.6/gems/actioncable-8.0.1/app/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/activestorage-8.0.1/app/assets/javascripts /home/deploy/.rvm/gems/ruby-3.3.6/gems/actionview-8.0.1/app/assets/javascripts):
在Rails控制台执行helper.asset_path("application.js")时,同样提示找不到jquery.ui.tabs文件。
资源目录结构
# tree app/assets app/assets ├── config │ └── manifest.js ├── images │ ├── abellard_logo.jpg │ ├── abellard_logo.png │ ├── abellard_SS_logo.png │ ├── false.png │ ├── numbe_accounting.jpg │ ├── numbe_accounting_large.jpg │ ├── tickmark.jpeg │ ├── tickmark.png │ ├── true.png │ ├── x.png │ ├── X.png │ ├── y.png │ └── Y.png ├── javascripts │ ├── application.js │ ├── journal_types.js.coffee │ ├── license_journal_types.js.coffee │ └── reports.js.coffee └── stylesheets ├── application.css ├── normalize.css ├── reports.css.scss ├── style.css ├── tweaks.css └── zcaffolds.css.scss
stylesheets/application.css内容
/* *= require_tree . *= require_self *= require jquery.ui.tabs *= require jquery.ui.button *= require jquery.ui.datepicker * require jquery.ui.accordion */
解决方案
一、修复jQuery UI文件找不到的问题
修正CSS引用路径
jquery-ui-rails 7.0.0的CSS文件引用规则已变更,需改用组件子路径格式,同时补全缺失的等号:/* *= require_tree . *= require_self *= require jquery-ui/tabs *= require jquery-ui/button *= require jquery-ui/datepicker *= require jquery-ui/accordion */确保gem依赖完整
执行bundle update jquery-ui-rails,确保依赖安装无缺失。
二、修复静态资源路由错误
配置Sprockets在Rails 8中生效
Rails 8默认使用Propshaft作为资产管道,若继续用Sprockets需手动配置:- 在
Gemfile添加:
执行gem 'sprockets-rails'bundle install。 - 在
config/application.rb中加入:require "sprockets/railtie" config.assets.enabled = true - 重启服务器。
- 在
更新manifest.js配置
调整app/assets/config/manifest.js内容,明确指定核心资源://= link_tree ../images //= link_directory ../javascripts .js //= link_directory ../stylesheets .css //= link application.css //= link application.js生产环境预编译资源
执行命令预编译静态资源:RAILS_ENV=production bundle exec rails assets:precompile确认
public/assets目录下生成对应编译文件。检查生产环境配置
在config/environments/production.rb中确认:config.public_file_server.enabled = true config.assets.digest = true # 若预编译正常,建议关闭compile;临时调试可设为true config.assets.compile = false
内容的提问来源于stack exchange,提问作者Lifeboy
相关产品推荐
相关产品推荐

