如何在rails4中为default_url使用摘要感知资产?

时间:2013-05-17 13:04:36

标签: asset-pipeline ruby-on-rails-4 carrierwave helper

在rails 3中,要将管道中的资源用作 carrierwave 上传器中的default_url,您可以执行以下操作:

class MyUploader
  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  def default_url
    # For Rails 3.1+ asset pipeline compatibility:
    asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  end
end

在rails 4中,管道已被抽象到 sprockets-rails gem / railtie中,因此上面的内容将为您提供:

  

未初始化的常量Sprockets :: Helpers

查看 sprockets-rails gem,替换助手似乎是Sprockets::Rails::Helper。但是,如果包含此模块,asset_path("fallback/default.png")将返回,只需:

# wrong:
"/fallback/default.png"

我期望的资产和摘要感知网址:

"/assets/fallback/default-b3beee1588afe2ae582c64888cd007db.png"

如何在视图外获得正确的asset_path行为?

1 个答案:

答案 0 :(得分:19)

TL; DR:

不要include任何事情。改为使用帮助代理,如下所示:

def default_url
  ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
end

血腥细节:

Sprockets::Rails::Helper使用sprockets清单来正确定位和消化资产。一旦它被抽象成为rails 4的gem,这个清单开始由铁路设置。因此,简单地include将模块的方法放入我们的类中并不足以将该清单拉入其中,asset_path(mis)也会相应地表现出来。

谢天谢地,有oft-overlooked ActionController::Base.helpers类方法:

  

提供从视图外部访问帮助程序方法的代理。

与文档说的一样,它充当帮助代理,可能是应该从开始就用于此目的(包括辅助模块到命名空间运行)使用未使用的方法污染您的类并可能覆盖内容的风险,因此使用代理是更好的选择。)

可能还有一些等价的Sprockets::Helpers::IsolatedHelper足以让Sprockets::Rails::Helper完成任务所需的{{1}}。但代理是,恕我直言,一个更优雅的解决方案。所以我已经停止了搜索。