6

Rails 3.1で導入されたアセットパイプラインを利用するために、このマルチスキンアプリを変換しました。ほとんどの場合、それは驚くほど簡単で、CSS/JSファイルでインラインRubyを使用できる前処理機能が大好きです。

しかし、私は大きな問題に遭遇しました。それは、スプロケットの力にもかかわらず、解決するのが難しいようです。私のアプリは、実行時に選択された任意の数のスキン(または「ID」)で実行できます。この「ID」パラメータは、キャッシュディレクトリ、データベース接続、ビューパス、そして実際にはアセットパスなどを設定します。すべての「ID」は独自のスタイルシートを持つことができますが、すべてのインスタンスで使用される共有スタイルシートもあります。したがって、アセットフォルダの構造は次のようになります。

/app/assets/stylesheets/aplication.css.erb:

<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>

これにより2つのスタイルシートが読み込まれ、重要なことに、構成されたアセットパスを使用してそれらを解決します(リゾルバーにヒットしないためrequire_assets、標準requireとディレクティブの代わりに使用するのはそのためです)。include最初に見つかった一致を返し、デフォルトのスタイルの一部または全体を非常に簡単にオーバーライドできます。それで

/app/assets/stylesheets/shared.css

インスタンスアセットフォルダに同じ名前のファイルを置くことでオーバーライドできます

/app/assets/[identity]/stylesheets/shared.css

そのようなファイルが存在しない場合は、デフォルトのshared.cssにサイレントにフォールバックします。

それはすべて見事に機能します-私はJavaScript、画像、フォントに同じ手法を使用し、プリコンパイル中にすべてがきちんと処理されてパッケージ化されます。しかし。私が達成できないタイプの(横向きの)継承があります。アイデンティティのスキンが他のスキンと非常に似ているため、数十行しか異なる場合があり(たとえば、レイアウトは同じですが配色が異なります)、本当に次のようなことができるようにしたいと思います。

アセット/スタイルシート/application.css.erb:

<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>

Assets / current_identity / stylesheets / overrides.css:

<% require_asset("../../some_other_identity/stylesheets/overrides.css") %>
/* followed by the dozen or so lines that differ for this skin */
...

現在のコンテキストでは「some_other_identity」がアセットパスにないため、これは失敗します-Railsは開発モードでファイルを検出しません。もちろん、プリコンパイル中にも含まれません。また、アセットパスに含めると、間違ったoverrides.cssが読み込まれます(1つしか存在できません)。だから私はoverrides.cssの一番上にこのようなものを置くことを実験してきました:

<%= File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css")) %>
/* rest of CSS */
...

そして確かにそれは期待通りに機能します。しかし。現在、アセットパイプラインを使用してすべてのアセットを提供しているため、CSS内の画像を固定パスで参照できなくなりました<%= asset_path("some_image.png") %>。パスリゾルバーがその魔法を働かせるには、を使用する必要があります。これは、私overrides.cssが本当にそうだということを意味します。overrides.css.erbもちろん、ERBの前処理は、実行しても発生しませんFile.read()。だから、私は立ち往生しています!ヘルプ!誰?

編集:私が使用する場合

<%= ERB.new(File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb"))).result %>

ERBを解析しようとしますが、

undefined method `asset_path' for main:Object

もちろん、これはasset_path("some_image.png")私が含めようとしているファイルでetcを使用しているためです。

4

1 に答える 1

5

何時間も検索した後、Sprocketsで利用可能なヘルパーメソッドのリストに出くわしました-これがGitHubのSprocketsのマニュアルページからリンクされていれば、多くの時間を節約できたでしょう(リンクはありますが、#を指していますFIXME)。Sprockets APIドキュメントから:

  • (Object) evaluate(path, options = {})
  • pathファイルのプロセッサを読み取って実行します。
  • これにより、アセットの結果をキャプチャして、別のアセットに直接含めることができます。
  • <%= evaluate "bar.js" %>

ビンゴ!includeディレクティブを次のように変更しました。

<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %>

そして、CSSが処理され、結果が挿入されます。これは、私が望んでいたとおりに機能します。

于 2012-06-24T18:41:10.300 に答える