在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
行为?
答案 0 :(得分:19)
不要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}}。但代理是,恕我直言,一个更优雅的解决方案。所以我已经停止了搜索。