【问题标题】:How to use a digest-aware asset for default_url in rails4?如何在 rails4 中为 default_url 使用摘要感知资产?
【发布时间】:2013-05-12 16:00:59
【问题描述】:

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

不是我期望的资产和摘要感知 URL:

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

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

【问题讨论】:

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


    【解决方案1】:

    TL;DR:

    不要include 任何东西。改为使用 helper 代理,如下所示:

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

    血腥细节:

    Sprockets::Rails::Helper 使用 sprockets 清单来正确定位和消化资产。一旦它被抽象为 rails 4 的 gem,这个清单就开始由 railtie 设置。所以仅仅include-ing 模块的方法到我们的类中是不够的,并且asset_path(错误)行为相应。

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

    提供一个代理来从视图外部访问辅助方法。

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

    可能还有一些等同于Sprockets::Helpers::IsolatedHelper 的组合足以为Sprockets::Rails::Helper 提供完成工作所需的东西。但代理是,恕我直言,一个更优雅的解决方案。所以我已经停止搜索了。

    【讨论】:

    • 值得注意的是,该文件必须实际存在才能正确生成路径。如果/app/images/fallback/default.png(默认版本)中不存在该文件,则会生成错误的路径。
    • @sevenseacat 你的评论帮助我调试了同样的问题,除了文件在那里,但我只需要在添加它们后反弹服务器。谢谢!
    • @DaveRapin 很高兴我能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多