如何在Rails 3.1中基于通配符子域向Sprockets添加资产搜索路径?

13
Rails Asset Pipeline guide指导您在config/application.rb中使用config.assets.paths,但此时我无法访问请求的子域。
我想能够基于请求的子域名为当前请求添加额外的路径(仅限当前请求)。 我的应用程序特定细节 这是一个基本的CMS应用程序。根domain.com主机处理标准控制器/视图呈现和默认资产路径的管理部分。
subdomain.domain.com的请求基于subdomain呈现站点。它在before_filter中调用prepend_view_path并为当前请求添加Rails.root.join('vendor/sites/[subdomain]/templates')
当请求主机为[subdomain].domain.com时,我想能够将Rails.root.join('vendor/sites/[subdomain]/assets')前置到Sprockets搜索路径中。 编辑 最终,我只是放入了一个Sprockets::Environment的mixin,覆盖了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)

1
资产管道并不是在生产环境中每次请求都编译您的资产。它非常适用于开发,但您应该将它们编译为静态文件以供生产使用。因此,您需要开发自己的系统来处理这个问题(也许是一个服务CSS文件的控制器?)或者单独构建您的应用程序。 - thomasfedb
2个回答

1

就像你为视图路径所做的那样,添加一个before过滤器并将新路径附加到Rails.application.config.assets.paths中

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


2
嗯,我很确定更改Rails.application.config.assets.paths将永久地为整个应用程序添加路径,而不仅仅是当前请求。这在你对Rails.application的调用中已经明确了。与prepend_view_paths相反,它只影响当前请求。因此,OP的问题是是否有类似于asset_paths的东西...但Rails.application不是它。查看prepend_view_paths的代码可能会给你一个想要自己破解的想法。 - jrochkind

1

我同意评论者在你的问题上所说的“资产管道并不是真正意义上在生产环境中每次请求都编译您的资产”,这使得无法完全实现您的要求。

那么,如何实现您真正想要实现的目标呢?即为不同的子域名提供不同的资产解析。将特定于子域的资产放在资产文件夹的子目录中。

现在,在视图/助手中,当您调用asset_path或任何其他采用相对资产路径的助手时,请请求“#{subdomain}/name_of_asset”而不仅仅是“name_of_asset”。

现在,由于资产编译器的工作方式,这种子目录方法可能不起作用,您可能需要将子域放在实际文件名的开头,例如“#{subdomain}_name_of_asset”。不确定。

这仍然不能为您提供一种“默认回退”的方式,其中某些子域中的某些资产没有特定于子域的资产,它们只是“回退”到默认值。这很好。可能还可以找到一种方法来实现这一点,但不确定。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接