ActionController :: RoutingError(没有路由匹配[GET]“/assets/blah.png”)Heroku

时间:2016-07-19 22:38:06

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

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

  

应该注意的是我使用的是rails 4.2。

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

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

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

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

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

上的文档

答案 1 :(得分:0)

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

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

    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任务结束时执行。