Rails 3.1 помощники SASS, не включая RAILS_RELATIVE_URL_ROOT /lative_url_root - PullRequest
3 голосов
/ 09 сентября 2011

Я работал над обновлением до Rails 3.1 с 2.3.11. Одним из основных препятствий для преодоления является переход на конвейер активов. В этом процессе я решил конвертировать мои CSS в Sass (SCSS). В rails 3.1 все ресурсы, доставленные по конвейеру, получают хэш, добавленный к имени файла в рабочей среде. Из-за этого все изображения, указанные в моем css, теперь должны были использовать помощники image-path или image-url в sass. Проблема в том, что, хотя я установил свой ENV ['RAILS_RELATIVE_URL_ROOT'] в моем помощнике по работе с ресурсами sas в файле environment.rb, не удалось включить относительный_url_root.

Просто для ясности, чтобы добавить относительный_url_root в rails 3.1, я добавил следующую строку в мой файл environment.rb:

ENV['RAILS_RELATIVE_URL_ROOT'] = '/foo'

и добавьте следующую строку в мой виртуальный хост:

RailsBaseURI /foo

Эта стратегия отлично работает для всех ссылок и тому подобного. Это просто помощники актива в Sass, которые, кажется, не работают должным образом. Любые идеи будут оценены.

1 Ответ

3 голосов
/ 11 сентября 2011

После небольшого копания я нашел проблему. Проблема в 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
...