首页 > 解决方案 > RAILS 6 + Webpacker -- 生产环境中 packs/css|js/application-* 的路由错误

问题描述

在开发模式下,一切看起来都很棒。但是当我切换到生产时,找不到引导程序。当我查看日志时,我看到如下错误:

ActionController::RoutingError (No route matches [GET] "/packs/js/application-2a5806e943e281221741.js"):

这对于 CSS 和 JS 都是如此。当我查看 public/packs 文件时,文件确实存在于相应的子目录中(.js 文件的 js 等)。所以,webpacker 完成了它的工作,但 puma 没有找到它。有任何想法吗?这是一个旧的 Rails 应用程序,它被迁移了几个版本的 rails,所以我确信在将所有东西捆绑在一起时我错过了一些东西。

标签: ruby-on-railsruby-on-rails-6production-environmentwebpacker

解决方案


为了扩展我认为是该问题正确答案的 Tenzin 的评论,开发中的 Rails 将始终重新渲染资产并为它们提供服务。这很慢,但对于在开发时查看快速更改很有用。

当我们想要部署到生产环境时,问题是 Rails 开始提供静态文件,这意味着服务器不再会在每次请求时呈现它们。它将为他们提供一次并永远为他们服务。使用 webpacker,您可以在 webpacker.yml 中找到提供这些资产的位置

  public_root_path: public
  public_output_path: packs

因此,如果您要在本地部署或尝试运行生产,请首先确保为生产编译您的资产,以便创建这些静态文件。

rake assets:precompile RAILS_ENV=production

然后确保无论服务器在哪里运行,它都有一个 ENV 变量 RAILS_SERVE_STATIC_FILES 设置为任何值。从 production.rb 中可以看出,

  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

只是检查这个变量是否存在。如果是,那么它不会像我们讨论的那样重新渲染,它会寻找 webpacker.yml 中显示的静态文件。

另外一个小提示,如果您使用 React UI 或 Bootstrap 之类的东西并且缺少 CSS,请确保您根据库的文档导入 CSS。

例如,在 Bootstrap 中,您需要在 app/javascript/packs/stylesheets(实际上是在 /javascript 文件夹中的任何位置)创建一个 application.scss 文件,并将其导入 /javascript/packs/application.js。

在 application.scss 你会想要

import "~bootstrap/scss/bootstrap"

这当然是在您将 Bootstrap 添加到您的 package.json 之后

yarn add bootstrap

推荐阅读