【问题标题】:Sprockets error Sprockets::NotImplementedError: Custom asset_path helper is not implementedSprockets 错误 Sprockets::NotImplementedError: 自定义asset_path 助手未实现
【发布时间】:2016-08-25 03:07:14
【问题描述】:

尝试在本地预编译我的资产时,我得到以下信息

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 的字形图标有一个空路径,因此不会渲染:

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")

这是我的 gemfile.lock,因为它与资产/链轮 gem 相关:

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)

【问题讨论】:

  • 你能分享一个完整的源代码来展示这个问题的最小工作示例吗?一个 git repo,例如。
  • 您是否按照文档中的说明导入了 boostrap-sprockets? github.com/twbs/bootstrap-sass#a-ruby-on-rails
  • 我认为 Glyphicon 问题只是我指定自定义 asset_path 初始化程序的症状。我真正需要弄清楚的是为什么它要求这样做。如果我创建一个全新的应用程序,它不会在预编译时要求它。
  • 你能告诉我你的源代码中asset_path方法在哪里使用吗?还有你的gemfile。
  • 您能否再提供几行堆栈跟踪信息?在我看来,这是一个 gem 版本控制问题(我无法重现)。令我印象深刻的是,在堆栈跟踪中您有sprockets-3.6.0 版本,但在您的Gemfile.lock 中有&lt; 3.0 版本。我在gem list 中只能看到一个链轮版本。也许您可能想尝试逐个更新相关的 gem,看看问题是否会随着一些 gem 更新而消失?

标签: ruby-on-rails assets sprockets precompile rails-sprockets


【解决方案1】:

我建议,主要问题出在sprockets 版本中。在我的 rails 4.2.6 项目中,我使用 sprockets 3.6.0,而在您的 Gemfile.lock sn-p 中,您使用

就像测试一样,您可以将 rails 更新到 4.2.6 并尝试新的 sprockets 3.6.0 + sprockets-rails 3.0.1 和新的 sass-rails 5.0.4sass 3.4.22 gem。我真的不知道其中哪一项更新会有所帮助,但是,我认为它应该可以工作。

【讨论】:

  • 我实际上也尝试过。我将 sprockets、sprockets-rails、sass-rails、sass 都升级到了最近的 gems。
【解决方案2】:

我不知道这是否可以作为答案,但我最终只是拉下了我的生产 Heroku 存储库并确认了所有预编译的内容。然后我慢慢升级了我所有的 gem,一切都继续正确预编译。我想我永远不会知道是什么原因造成的。感谢那些做出贡献的人。

【讨论】:

  • 我走上了一条类似的令人困惑的道路,或者删除和添加了一些东西,但事实证明我收到此错误的原因是因为我在初始化程序中有一个全局 #include ActionView::Helpers::AssetUrlHelper :-/
【解决方案3】:

您可以轻松克服这个问题。尽管您当前的问题更多是与版本相关的问题,并且不确定您是否正确捆绑更新。但是有替代解决方案。尝试安装以下 gem:

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

【讨论】:

  • 我不认为添加另一个 gem 是答案。正如我所说的那样,我能够拉下我的 prod 存储库并从那里一一重建,而无需任何自定义资产帮助器。
  • 我能够重现该问题,并且添加 sprockets-helpers gem 确实解决了这个问题。关于我为什么突然需要它的任何见解?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2014-04-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多