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を使用しているためです。