2012-06-24 12 views
6

私はこのマルチスキンアプリをRails 3.1で導入されたアセットパイプラインを利用するように変換しました。ほとんどの場合、それは驚くほど簡単で、私はあなたのCSS/JSファイルでインラインRubyを使用できるようにする前処理能力に賛成しています。私は大きな問題に遭遇しましたが、Sprocketsの力にもかかわらず解決するのは難しいようです。私のアプリは、実行時に選択される任意の数のスキン(または「アイデンティティ」ではなく)で実行できます。この「アイデンティティ」パラメータは、キャッシュディレクトリ、データベース接続、ビューパス、実際にはアセットパスのようなものを設定します。すべての "アイデンティティ"は独自のスタイルシートを持つことができますが、すべてのインスタンスにわたって使用される共有されたスタイルシートもあります。 /app/assets/stylesheets/aplication.css.erbでRailsのアセットパイプライン - アセットのパスに含まれないアセットを含める方法

::だから資産フォルダ構造は次のようになります

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

これは、2つのスタイルシートをロードし、そして決定的にそれを解決するために構成された資産・パスを使用していますそのため、私は標準requireincludeのディレクティブの代わりにrequire_assetsを使用しているため、リゾルバにヒットしません。見つかった最初の一致が返され、デフォルトスタイルの一部または全部を簡単にオーバーライドできます。だから、

/app/assets/stylesheets/shared.css 

は、インスタンス資産フォルダ

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

に同じ名前のファイルを置くことによって上書きすることができ、そのようなファイルが存在しない場合、それは黙って背中デフォルトshared.cssに落ちます。

すべてがうまく動作します - 私はJavascript、画像、フォントに同じテクニックを使用しており、すべてがプリコンパイル時にきちんと処理されてパッケージ化されます。しかし。私が達成できないタイプの(横向きの)継承があります。 時々アイデンティティのためのスキンは他のアイデアのスキンと似ているので、いくつかの線が異なるだけです(例えば同じレイアウトですが色分けが異なります)。

アセット/stylesheets/application.css.erb:

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

資産/ current_identity /スタイルシート/ overrides.css:

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

現在のコンテキストで "some_other_identityは、" 資産・パスにないため、これが失敗s - Railsはファイルをdevモードで見つけられません。もちろん、それはプリコンパイル時には含まれません。アセットパスに含めると、間違ったoverrides.css(は1つしかありません)をロードします。です。だから、私はこのようなものを上書きの上に置いて実験しています。

<%= 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であることを意味します。もちろん、File.read()を実行するとERB前処理が行われません。だから、私は立ち往生している!助けて!誰でも?

編集:私は

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

を使用する場合は、ERBを解析しようとしないが、私は、私はもちろん、ファイルにasset_path("some_image.png")などを使用して、私が原因である

undefined method `asset_path' for main:Object 

を取得私は含めようとしている。

+0

私は、.erb拡張子を 'File.read()' CSSファイル名に追加すると(それは.erbファイルでもあるので)それを解決するだろうと思っていました。 –

+0

そして 'render()'を使うことはできません - [この質問を見る](http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –

答えて

5

私はthe list of available helper methods in Sprocketsにアクセスしました。これはGitHubのthe Sprockets man page(リンクがありますが、#FIXMEを指しています)にリンクされていました。スプロケットAPIドキュメントから:

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

ビンゴ!私は私にはincludeディレクティブを変更:

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

とCSSは処理されますと結果が挿入され、私はそれが動作するように望んでいただけの方法。

+0

ありがとう参考までに、私を助けました。 –

関連する問題