13

Rails Asset Pipeline ガイドではconfig.assets.pathsinを使用するように指示されconfig/application.rbていますが、現時点ではリクエストのサブドメインにアクセスできません。

リクエストのサブドメインに基づいて、追加のパス (現在のリクエストのみ) を追加できるようにしたいと考えています。

私のアプリケーション固有の詳細

基本的なCMSアプリです。ルートdomain.comホストは、標準のコントローラー/ビュー レンダリングとデフォルトのアセット パスを使用して管理部分を処理します。

subdomain.domain.comに基づいてサイトをレンダリングするリクエストsubdomain。を呼び出しprepend_view_pathて、現在のリクエストのみbefore_filterを追加 します。Rails.root.join('vendor/sites/[subdomain]/templates')

リクエストRails.root.join('vendor/sites/[subdomain]/assets')ホストが[subdomain].domain.com.

編集

callメソッドSprockets::Environmentを上書きするためのミックスインをドロップするだけになりました。

module SiteAssetsResolver
  def call(env)
    begin
      # prepend path based on subdomain (from env)
      super # Sprockets::Server#call
    ensure
      # remove path based on subdomain
    end
  end
end

MyApp::Application.assets.extend(SiteAssetsResolver)
4

2 に答える 2

1

「アセットパイプラインは、実際には、本番環境でリクエストごとにアセットをコンパイルすることを意図したものではありません」という質問に対するコメントに同意します。-あなたが求めていることを正確に行うことを実際には不可能にします。

では、ここで実際に達成しようとしていることを達成するための代替手段はどうでしょうか。これは、サブドメインごとに異なるアセット解決です。サブドメイン固有のアセットをアセットフォルダーのサブディレクトリに配置します。

ここで、ビュー/ヘルパーで、asset_pathまたは相対的なアセットパスを使用する他のヘルパーを呼び出すときに、単に「name_of_asset」ではなく「#{subdomain}/name_of_asset」を要求します。

現在、アセットコンパイラの動作方法により、このサブディレクトリメソッドが動作しない可能性があります。代わりに、実際のファイル名の先頭にサブドメインを配置する必要があります「#{subdomain}_name_of_asset」。わからない。

そして、これでも、一部のサブドメインの一部のアセットにサブドメイン固有のアセットがなく、デフォルトに「フォールスルー」するような「デフォルトのフォールスルー」は提供されません。どちらがいいでしょう。それを行う方法も考えられる可能性がありますが、確かではありません。

しかし、いずれにせよ、ビュー/ヘルパーのロジックを使用して表示時に別のアセットを要求するというこのアプローチに従うと、元の提案されたアプローチよりもさらに進んでいきます。これはおそらく不可能です。

于 2011-09-30T13:01:53.490 に答える
1

ビューパスの場合と同じように、beforeフィルターを追加し、新しいパスをRails.application.config.assets.pathsに追加します。

Railscasts#279を見てこのアイデアを思いついたアセットパイプラインを理解する

于 2011-09-28T13:38:58.850 に答える