首页 > 解决方案 > 在 Rail 5.4.2 中找不到 rails_admin.css

问题描述

Rails Admin 在本地为我工作,但是当我部署到 Heroku 时,它失败了:

ActionView::Template::Error (The asset "rails_admin/rails_admin.css" is not present in the asset pipeline

我在 Rails 5.2.6 和 Rails Admin 2.0.2 上

我用这一行添加了 initializers/assets.rb: Rails.application.config.assets.precompile += ['rails_admin/rails_admin.css', 'rails_admin/rails_admin.js']

但这些文件不存在于 assets/javascripts 和 assets/stylessheets 中。

这个应用程序最初是作为一个仅 API 的应用程序构建的,但我添加了所有缺少的中间件以使其像普通的 Rails 应用程序一样工作。

这是我的应用程序.rb:


require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module CheckwizApi
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Only loads a smaller set of middleware suitable for API only apps.
    # Middleware like session, flash, cookies can be added back manually.
    # Skip views, helpers and assets when generating a new resource.
    config.api_only = false

    # use uuid's as primary_key
    config.active_record.primary_key = :uuid
    config.generators do |g|
      g.orm :active_record, primary_key_type: :uuid
    end
    
    config.i18n.default_locale = :en    

    config.active_job.queue_adapter = :sidekiq

    # Added because RailsAdmin needs them
    config.middleware.use ActionDispatch::Cookies
    config.middleware.use ActionDispatch::Flash
    config.middleware.use Rack::MethodOverride
    config.middleware.use ActionDispatch::Session::CookieStore
  end
end

请注意,我已经设置config.api_only = false并添加了所需的中间件,但无济于事。如果我将其设置为 true,同样的错误。如果我删除上面添加的资产文件,同样的错误。

assets/javascripts 和 assets/stylesheets 文件夹是空的。那是问题吗?

我查看了其他几个与此相关的已关闭问题,其中大多数建议添加上述中间件,或清除 tmp/cache 并重新启动。可悲的是,它们都没有为我工作。

标签: ruby-on-rails

解决方案


必须做很多事情来解决这个问题。

首先,我将config/initializers/assets.rb文件更新为:

Rails.application.config.assets.enabled = true
# Prevent initializing the application before assets are precompiled (required for heroku)
Rails.application.config.assets.initialize_on_precompile = false
# Add Rails Admin assets (required)
Rails.application.config.assets.precompile += ['rails_admin/rails_admin.css', 'rails_admin/rails_admin.js']

然后,通过检查 Heroku 上的 Rails 日志:

heroku logs -t --remote production

我发现了这条线:

Detected manifest file, assuming assets were compiled locally

所以在里面public/assets我删除了清单文件(如果你在本地编译资产就会创建它,也许我曾经做过一次尝试解决这个问题,但忘记了它在那里)。

然后,这导致 heroku 日志中出现以下错误:

Sprockets::ArgumentError: link_directory argument must be a directory

所以我然后添加了一个隐藏的空文件,分别调用里面.keepjavascriptsstylesheets文件夹app/assets

现在 Heroku 将资产预编译任务作为部署的一部分运行(即在构建 slug 的同时),并创建 rails_admin js 和 css 文件。

更多信息herehere有助于解决这个问题。


推荐阅读