少し掘り下げた後、私は問題を見つけました。この問題は Rails、特に Sprockets::Helpers::RailsHelper::AssetPaths#compute_public_path にあります。Sprockets::Helpers::RailsHelper::AssetPaths は ActionView::AssetPaths を継承し、いくつかのメソッドをオーバーライドします。Sass::Rails::Resolver#public_path メソッドを通じて compute_public_path が呼び出されると、sass-rails で、Rails sprocket ヘルパーがアセットを解決するタスクを取得します。Sprockets::Helpers::RailsHelper::AssetPaths#compute_public_path は、ActionView::AssetPaths#compute_public_path である super に従います。このメソッドには has_request? という条件があります。以下に示すように、rewrite_relative_url_root で:
def compute_public_path(source, dir, ext = nil, include_host = true, protocol = nil)
...
source = rewrite_relative_url_root(source, relative_url_root) if has_request?
...
end
def relative_url_root
config = controller.config if controller.respond_to?(:config)
config ||= config.action_controller if config.action_controller.present?
config ||= config
config.relative_url_root
end
rewrite_relative_url_root の内部を見ると、存在する要求と、相対 URL ルートを解決するためにコントローラー変数からそれを派生させる機能に依存しています。問題は、スプロケットが sass 用にこれらのアセットを解決するときに、コントローラーが存在しないため、リクエストがないことです。
上記の解決策は、開発モードでは機能しませんでした。これが、今のところ機能させるために使用しているソリューションです。
module Sass
module Rails
module Helpers
protected
def public_path(asset, kind)
resolver = options[:custom][:resolver]
asset_paths = resolver.context.asset_paths
path = resolver.public_path(asset, kind.pluralize)
if !asset_paths.send(:has_request?) && ENV['RAILS_RELATIVE_URL_ROOT']
path = ENV['RAILS_RELATIVE_URL_ROOT'] + path
end
path
end
end
end
end