链轮错误 Sprockets::NotImplementedError: 自定义 asset_path 助手未实现。

10

在本地尝试预编译我的资产时,我遇到了以下问题

RAILS_ENV=production bundle exec rake assets:precompile

rake aborted!
Sprockets::NotImplementedError: Custom asset_path helper is not implemented

Extend your environment context with a custom method.

    environment.context_class.class_eval do
      def asset_path(path, options = {})
      end
    end
/Users/cman/.rvm/gems/ruby-2.2.2@jbd-ruby2.2.2/gems/sprockets-3.6.0/lib/sprockets/context.rb:198:in `asset_path'
/Users/cman/.rvm/gems/ruby-2.2.2@jbd-ruby2.2.2/gems/sprockets-3.6.0/lib/sprockets/context.rb:218:in `font_path'
/Users/cman/.rvm/gems/ruby-2.2.2@jbd-ruby2.2.2/gems/font-awesome-rails-4.6.1.0/app/assets/stylesheets/font-awesome.css.erb:15:in `_evaluate_template'

我简直想不明白为什么会发生这种情况 - 如有任何解决建议,不胜感激!

更新

如果我添加以下初始化器,我就能够预编译:

Rails.application.assets.context_class.class_eval do
  def asset_path(path, options = {})
    return ''
  end
end
然而,如果我这样做,当我推送到我的临时环境时,Bootstrap的glyphicons路径为空,因此无法呈现:
font-face{font-family:'Glyphicons Halflings';src:url("");src:url("") format("embedded-opentype"),url("") format("woff"),url("") format("truetype"),url("") 

更新2

如果我将初始值修改为以下内容,我会在预编译的引导资产中获得一个路径,用于glypicons,但它不是指向预编译的Glyphicon文件,而是非编译的资产路径:

Rails.application.assets.context_class.class_eval do
  def asset_path(path, options = {})
    #return ''
    "/assets/#{path}"
  end
end

@font-face{font-family:'Glyphicons Halflings';src:url("/assets/bootstrap/glyphicons-halflings-regular.eot");src:url("/assets/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("/assets/bootstrap/glyphicons-halflings-regular.woff") format("woff"),url("/assets/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"),url("/assets/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular")

这是与资产/ Sprockets 宝石有关的我的 gemfile.lock 文件:

bootstrap-sass (3.1.1.0)
      sass (~> 3.2)
rails (4.2.5.2)
      actionmailer (= 4.2.5.2)
      actionpack (= 4.2.5.2)
      actionview (= 4.2.5.2)
      activejob (= 4.2.5.2)
      activemodel (= 4.2.5.2)
      activerecord (= 4.2.5.2)
      activesupport (= 4.2.5.2)
      bundler (>= 1.3.0, < 2.0)
      railties (= 4.2.5.2)
      sprockets-rails
sass (3.2.19)
    sass-rails (4.0.5)
      railties (>= 4.0.0, < 5.0)
      sass (~> 3.2.2)
      sprockets (~> 2.8, < 3.0)
      sprockets-rails (~> 2.0)

1
你能分享一个最小化的工作示例,展示出问题的全部源代码吗?例如一个Git仓库。 - smathy
你是否按照文档中所述导入了boostrap-sprockets?https://github.com/twbs/bootstrap-sass#a-ruby-on-rails - Marc Lainez
我认为Glyphicon问题只是我指定自定义asset_path初始化程序的症状。我真正需要弄清楚的是为什么它会要求这样做。如果我创建一个全新的应用程序,它不会在预编译时要求这样做。 - cman77
你能给我展示一下你的源代码中 asset_path 方法的使用吗?还有你的 Gemfile 文件。 - uday
你能提供一下堆栈跟踪的几行吗?在我看来,这似乎是一个宝石版本问题(我无法重现)。另外让我惊讶的是,在堆栈跟踪中,你有sprockets-3.6.0版本,但在你的Gemfile.lock中是< 3.0版本。在我的gem list中只能看到一个sprocket版本。也许你可以尝试逐个更新相关的gems,看看是否通过某些gem更新解决了这个问题? - Matouš Borák
3个回答

2
我认为主要问题在于版本。在我的Rails 4.2.6项目中,我使用的是3.6.0版本,在你的代码片段中你使用低于3.0版本的。
像测试一样,你可以将Rails更新到4.2.6版本并尝试使用最新的sprockets 3.6.0 + sprockets-rails 3.0.1和最新的和 gem包。我真的不知道这些更新中的哪一个会起作用,但我认为应该有效。

我也尝试过这个。我将sprockets、sprockets-rails、sass-rails和sass全部升级到最新的gems版本。 - cman77

2

我不知道这是否算作一个答案,但是我最终只是拉下了我的Heroku生产仓库,并确认所有的内容都已经预编译。然后我慢慢升级了所有的Gem,一切都能够正常地进行预编译。我想我永远都不会知道这是什么原因导致的。感谢那些做出贡献的人。


1
我曾走过类似混乱的道路,尝试添加和删除各种东西,但最终发现导致这个错误的原因是我在初始化器中全局引用了 #include ActionView::Helpers::AssetUrlHelper。 :-/ - mraaroncruz

1
你可以轻松解决这个问题。虽然您目前的问题更多是版本相关的问题,不确定您是否正确更新了捆绑包。但有替代方案。尝试安装以下宝石(gem):

https://github.com/petebrowne/sprockets-helpers


我认为添加另一个 gem 不是答案。正如我所说,我能够逐个从我的生产库中拉取并重新构建,而无需使用自定义资产助手。 - cman77
我已经成功重现了这个问题,并且添加sprockets-helpers gem确实解决了这个问题。你有什么想法,为什么突然需要它? - cman77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接