3

Rails 2.3.11 から 3.1 へのアップグレードに取り組んでいます。クリアすべき主なハードルの 1 つは、アセット パイプラインへの変換です。このプロセスで、css を sass (scss) に変換することにしました。Rails 3.1 では、パイプラインを介して配信されるすべてのアセットは、本番環境でファイル名に追加されたハッシュを受け取ります。このため、css で参照されているすべての画像は、sass で image-path または image-url ヘルパーを使用する必要がありました。問題は、ENV['RAILS_RELATIVE_URL_ROOT'] を environment.rb ファイルに設定したにもかかわらず、sass アセット ヘルパーが relative_url_root をインクルードできないことです。

わかりやすくするために、Rails 3.1 に relative_url_root を追加するために、environment.rb ファイルに次の行を追加しました。

ENV['RAILS_RELATIVE_URL_ROOT'] = '/foo'

次の行を仮想ホストに追加します。

RailsBaseURI /foo

この戦略は、すべてのリンクなどでうまく機能するようです。適切に動作していないように見えるのは、sass のアセット ヘルパーだけです。どんなアイデアでも大歓迎です。

4

1 に答える 1

3

少し掘り下げた後、私は問題を見つけました。この問題は 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
于 2011-09-10T20:17:11.063 に答える