私はこのマルチスキンアプリをRails 3.1で導入されたアセットパイプラインを利用するように変換しました。ほとんどの場合、それは驚くほど簡単で、私はあなたのCSS/JSファイルでインラインRubyを使用できるようにする前処理能力に賛成しています。私は大きな問題に遭遇しましたが、Sprocketsの力にもかかわらず解決するのは難しいようです。私のアプリは、実行時に選択される任意の数のスキン(または「アイデンティティ」ではなく)で実行できます。この「アイデンティティ」パラメータは、キャッシュディレクトリ、データベース接続、ビューパス、実際にはアセットパスのようなものを設定します。すべての "アイデンティティ"は独自のスタイルシートを持つことができますが、すべてのインスタンスにわたって使用される共有されたスタイルシートもあります。 /app/assets/stylesheets/aplication.css.erbでRailsのアセットパイプライン - アセットのパスに含まれないアセットを含める方法
::だから資産フォルダ構造は次のようになります
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
これは、2つのスタイルシートをロードし、そして決定的にそれを解決するために構成された資産・パスを使用していますそのため、私は標準require
とinclude
のディレクティブの代わりに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
を取得私は含めようとしている。
私は、.erb拡張子を 'File.read()' CSSファイル名に追加すると(それは.erbファイルでもあるので)それを解決するだろうと思っていました。 –
そして 'render()'を使うことはできません - [この質問を見る](http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –