我们有一个rails 5.1.7版本的应用程序,在开发环境中一切都运行得很好.但在临时环境中或使用rails s -e staging运行服务器时,我们会看到这个错误"Chaprkets::Rils::Helper::AssetNotFound".

例如,The asset "fontawesome-free-5.1.1-web/css/all.min.css" is not present in the asset pipeline

文件夹fontawesome-free-5.1.1-web位于public/styleheets下.

我try 将文件夹移动到vendor/stylesheetsassets/stylesheets,但我看到相同的错误.

下面是我的environments/staging.rb

AppName::Application.configure do
  config.cache_classes = true

  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = true
  config.action_view.cache_template_loading = true
  config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

  config.log_level = :debug
  memcached_config = YAML.load_file(Rails.root.join('config/memcached.yml'))
  memcached_hosts = memcached_config['defaults']['servers']
  config.cache_store = :mem_cache_store, *memcached_hosts


  config.action_mailer.delivery_method = :smtp
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true
  config.i18n.fallbacks = true

  config.active_support.deprecation = :notify

  config.eager_load = true
  config.assets.js_compressor = Uglifier.new(harmony: true)
  config.assets.compile = false
  config.assets.raise_runtime_errors = true
  config.assets.debug = true
end

如果你能帮我解决问题,那就太好了,谢谢.

推荐答案

我假设你是在这么做:

<%= stylesheet_link_tag 'fontawesome/all.min.css' %>  
vendor/
└── assets/                  # <= this one is important
    └── stylesheets/
        └── fontawesome/
            └── all.min.css

vendor/assetsapp/assets中的目录会自动添加到资源路径.以下是链轮用于查找资源的路径:

>> puts Rails.application.config.assets.paths
...
/myapp/app/assets/stylesheets
/myapp/vendor/assets/stylesheets         # <=
/usr/local/bundle/gems/coffee-rails-4.2.2/lib/assets/javascripts
/usr/local/bundle/gems/actioncable-5.2.8.1/lib/assets/compiled
...

你有config.assets.compile = false个,这意味着链轮已经完成了在资源路径中的查找和动态编译.它现在预计public/assets年会有预编译的assets资源 :

# assuming sprockets is still serving files (but not compiling them anymore)
>> Rails.application.config.public_file_server.enabled
=> true
>> Rails.application.config.assets.compile
=> false

>> helper.asset_path("fontawesome/all.min.css")
Traceback (most recent call last):
        1: from (irb):5
Sprockets::Rails::Helper::AssetNotFound (The asset "fontawesome/all.min.css" is not present in the asset pipeline.)

你必须做到bin/rails assets:precompile:

# config/initializers/assets.rb

# but make it precompilable first
Rails.application.config.assets.precompile += ["fontawesome/all.min.css"]
$ bin/rails assets:precompile

I, [2023-09-10T10:04:24.038220 #1]  INFO -- : Writing /myapp/public/assets/fontawesome/all.min-1f62e82d4d0217052a8d48596d631f5c58ee5149386c719419046118e4fa43f3.css
...

现在应该可以工作了:

>> helper.asset_path("fontawesome/all.min.css")
=> "/assets/fontawesome/all.min-1f62e82d4d0217052a8d48596d631f5c58ee5149386c719419046118e4fa43f3.css"

# check if it is being served
>> require "open-uri"
>> URI.open(helper.asset_path("fontawesome/all.min.css", host: "http://localhost:3000")).read
=> "i am font\n"

100


Update

要批量处理文件,有两种 Select .添加将动态匹配资源以进行预编译的过程:

# config/initializers/assets.rb

VENDOR_ASSETS = lambda do |logical_path, filename|
  filename.start_with?(::Rails.root.join("vendor/assets/").to_s) &&
    [".css", ".js"].include?(File.extname(logical_path))
end

Rails.application.config.assets.precompile += [VENDOR_ASSETS]

100

更好的 Select 是使用manifest.js,这是更高版本中的默认设置:

# config/initializers/assets.rb

# don't need this in sprockets v4
Rails.application.config.assets.precompile += ["manifest.js"]
// app/assets/config/manifest.js

//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
//
// link everything to be precompiled
//= link_tree ../../../vendor/assets/stylesheets .css
//= link_tree ../../../vendor/assets/javascripts .js
//
// or one file at a time 
//= link fontawesome/all.min.css

100


此外,当您预编译assets资源 时,这意味着您希望通过URL直接加载它们.如果只使用//= require条指令,则不需要预编译所需的文件,因为它们会合并到预编译的文件中.你只会得到一个很大的application.css文件:

/* app/assets/stylesheets/application.css */

/*
 *= require_tree .
 *= require_self
 *= require fontawesome/all.min
 */

如果您要在本地预编译以进行测试,请不要在完成后忘记使用bin/rails assets:clobber,您不希望在开发中使用预编译assets资源 .

Ruby-on-rails相关问答推荐

有什么办法能把这写清楚吗?

mini_racer gem 0.8.0无法与Ruby 3.1.xBundle 安装

Rails 7,返回具有两个单独条件的活动记录关联,一个在父级,一个在子级

删除 aws s3 (rails7) 上的日志(log)文件

组织和/或存储我一直在 RSpec 中使用的模拟对象的最佳方式是什么?

Rails - 如何从模型中查询 has_many

你能从 Heroku dynos/workers 中获得多少性能?

验证以确保唯一性但忽略空值?

twitter bootstrap下拉突然不起作用

Rails Mailer Net::OpenTimeout: execution expired 仅在生产服务器上出现异常

如何从 ActiveRecord 中的每个组中获取最新记录?

是否可以在 Rails 集成测试或规范中指定用户代理?

在 Rails/ActiveRecord 列名中使用问号字符

Ruby on Rails 中的MySQL 服务器已经消失

如何在 Rails 3 中将多个属性传递给 find_or_create_by?

使用 ruby​​ on rails 活动记录插入多条记录

如何在每个操作的基础上禁用 Ruby on Rails 的日志(log)记录?

rake db:回滚不起作用?

Ruby on Rails:如何在 select_tag 中使用默认占位符?

Rails - 邮件,将正文作为纯文本获取