9

Rails 3 で、パイプラインのアセットをdefault_urlCarrierwaveアップローダーとして使用するには、次のようにします。

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ビューの外で正しい動作を得るにはどうすればよいですか?

4

1 に答える 1

19

TL;DR:

何もしないでくださいinclude。代わりに、次のようにヘルパー プロキシを使用します。

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

血まみれの詳細:

Sprockets::Rails::Helperスプロケット マニフェストを利用して、アセットを適切に見つけて消化します。Rails 4 の gem に抽象化されると、このマニフェストは railtie によって設定され始めました。したがって、単にincludeモジュールのメソッドをクラスに追加するだけでは、そのマニフェストを取り込むのに十分ではなく、asset_pathそれに応じて (誤って) 動作しました。

ありがたいことに、見過ごされがち ActionController::Base.helpersなクラス メソッドがあります。

ビューの外部からヘルパー メソッドにアクセスするためのプロキシを提供します。

ドキュメントが言うように、それはヘルパー プロキシとして機能し、おそらく最初からこの目的のために使用されるべきものでした (名前空間にヘルパー モジュールを含めると、未使用のメソッドでクラスを汚染し、潜在的に上書きする危険性があるため、プロキシはより良い代替手段です)。

仕事を成し遂げるために必要なものSprockets::Helpers::IsolatedHelperを提供するのに十分なハックと同等のものがまだあるかもしれません. Sprockets::Rails::Helperしかし、プロキシは、私見ですが、はるかに洗練されたソリューションです。だから探すのをやめた。

于 2013-05-17T13:04:35.837 に答える