После небольшого копания я нашел проблему. Проблема в Rails, а именно в Sprockets :: Helpers :: RailsHelper :: AssetPaths # compute_public_path. Sprockets :: Helpers :: RailsHelper :: AssetPaths наследуется от ActionView :: AssetPaths и переопределяет ряд методов. Когда compute_public_path вызывается через метод Sass :: Rails :: Resolver # public_path is sass-rails, помощник rails sprocket выполняет задачу разрешения ресурса. Sprockets :: Helpers :: RailsHelper :: AssetPaths # compute_public_path определяет супер, который является ActionView :: AssetPaths # compute_public_path. В этом методе есть условие 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