【问题标题】:ActionController::RoutingError (No route matches [GET] "/assets/blah.png") HerokuActionController::RoutingError (没有路由匹配 [GET] "/assets/blah.png") Heroku
【发布时间】:2016-11-23 00:04:55
【问题描述】:

我在这里看到这个错误在多个不同的线程中运行了几次,但是尽管在尝试了几乎所有提到的解决方案之后,我仍然在我的heroku logs 中遇到了多个这些错误。

需要注意的是,我使用的是 rails 4.2。

有趣的是HTML 中的图像加载正常,然而尝试从我的SCSS 文件访问的图像根本没有加载,我遇到了以下错误在这些文件上。

ActionController::RoutingError (No route matches [GET] "/assets/roses-right.png"):

正如我所说,我尝试了多种解决方案,包括在本地和 heroku 服务器上运行 rake assets:precompile。我还尝试在config/environments/production.rb 中设置config.serve_static_files = true,但仍然没有骰子。最后,在我的 gemfile 中,我确实有以下块:

group :production do
  gem 'pg'
  gem 'rails_12factor'
end

这里的任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 heroku asset-pipeline


    【解决方案1】:

    您需要更改 scss 以使用 gem 提供的 sass 助手,例如:

    image-path('roses-right.png')
    

    查看https://github.com/rails/sass-rails#asset-helpers的文档

    【讨论】:

    • 不幸的是,这不起作用,每当我尝试使用其中一个帮助程序时,我都会遇到错误并且预编译不起作用。
    • 只是为了确定,你有 gem 'sass-rails'?
    • 是的,它绝对是 sass-rails
    • 你能试试不带双引号吗?在scss中使用双引号之前我遇到了一些问题
    • 成功了!但是我使用了更多类似background: image-url('header_background.png'); 的内容
    【解决方案2】:

    我在 Rails 5 的生产模式中使用引擎作为宝石,在 /vendor/assets/.. 下还有一个问题:

    • 图片引用自原始供应商的 css 代码(例如 jquery-ui),因此没有任何用于资产管道的 scss 转换代码,如“image-path”、“image-url”、“asset-path”或“asset” -url"
    • 如果您将其添加到 config/initializers/assets.rb,所有这些供应商图像也通过“rake assets:precompile”预编译到 /public/assets

      Rails.application.config.assets.precompile += %w( *.ico *.gif *.png *.jpg )
    • 来自 css 的运行时引用已经使用本机图像名称而不是预编译的哈希名称,因此最终会出现“没有路由...”

    我的解决方案是将 /public/assets 中的资产管道对象复制到其本机名称,因此每个文件都有两个版本。 本机名称和散列名称。

    • 本地名称是从 sprockets 清单文件中获取的,所以我不能知道这些文件在 gem 路径中的真实位置

    • 复制是作为“rake assets:precompile”的一部分完成的

    创建一个文件“lib/tasks/precompile.rake”

    require 'json'
    require 'fileutils'
    
    namespace :assets do
      task :precompile do
        puts '####### Task assets:precompile extended in lib/tasks/precompile.rake !'
        puts '####### Add native files to public/assets if requested outside from asset pipeline'
    
        Dir.glob("public/assets/.sprockets-manifest*.json").each do |fname|
          manifest = IO.read(fname)
          mhash = JSON.parse(manifest)
          mhash['files'].each do |key, value|
            source = "public/assets/#{key}"
            target = "public/assets/#{value['logical_path']}"
    
            puts "# create #{target}"
            FileUtils.cp(source, target)
          end
        end
      end
    end
    

    这样克隆代码在“assets:precompile” rake 任务结束时执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多