Ошибка преобразования пути к ресурсам в gem sprockets-rails
Эту ошибку я обнаружил уже давно, даже сообщал это авторам gem sprockets-rails
, но ко мне не захотели прислушиваться. Впервые заметил ошибку, когда в редакторе CKEditor исчезли все иконки как раз после очередного обновления gem-ов. В итоге я просто сам исправил ошибку в gem-е и при каждой новой установке (новая версия Ruby, например) я просто немного поправляю один файл в gem - и всё работает прекрасно у меня.
Проблема состоит в том, что в gem sprockets-rails
с ошибкой подставляются (изменяются) пути до различных ресурсов, например, изображений. Допустим, где-то в коде css есть указание url('image.png')
, после обработки путь будет заменен на url('/image.png')
. Не знаю, чем думали авторы, когда писали это, но суть в том, что они заменяют относительный путь до изображения абсолютным, но правильно было бы либо вообще не менять, либо заменить на url('./image.png')
- разница всего лишь в одной точке в начале пути, но как меняет смысл!
Исправление ошибки в gem
В gem sprockets-rails
в файле lib/sprockets/rails/asset_url_processor.rb
необходимо внести небольшие изменения:
def self.call(input) context = input[:environment].context_class.new(input) data = input[:data].gsub(REGEX) do |_match| path = Regexp.last_match[:path] # original: "url(#{context.asset_path(path)})" # === my patch instead of the original above orig_path = path path = context.asset_path(path) path = (path == "/#{orig_path}") ? ".#{path}" : path "url(#{path})" end context.metadata.merge(data: data) end
В последствии в gem добавили дополнительную опцию конфигурации, но свой патч я всё же не отменил, потому как неизвестно - какие ещё пути могут обрабатываться, но опция полезная:
config.assets.resolve_assets_in_css_urls
When this option is enabled, sprockets-rails will register a CSS postprocessor to resolve assets referenced in url() function calls and replace them with the digested paths. Defaults to true
.