13

Rails 资产管道指南指导您使用config.assets.paths,但此时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.

编辑

我最终只是加入了一个 mixin,因为Sprockets::Environment它覆盖了call方法:

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 或任何其他采用相对资产路径的助手时,向它询问“#{subdomain}/name_of_asset”,而不仅仅是“name_of_asset”。

现在,由于资产编译器的工作方式,这个子目录方法可能不起作用,您可能不得不将子域放在实际文件名的开头。“#{子域}_name_of_asset”。没有把握。

而且这仍然不会给您一种“默认失败”,其中某些子域中的某些资产没有特定于子域​​的资产,它们只是“失败”到默认值。这会很好。也有可能找到一种方法来做到这一点,不确定。

但无论如何,遵循这种在显示时使用视图/帮助器中的逻辑请求不同资产的方法......将使您比最初建议的方法更进一步,这可能是不可能的。

于 2011-09-30T13:01:53.490 回答
1

正如您对视图路径所做的那样,添加一个前置过滤器并将新路径附加到 Rails.application.config.assets.paths

我在观看Railscasts #279 了解资产管道时产生了这个想法

于 2011-09-28T13:38:58.850 回答