【问题标题】:How do I add asset search paths to Sprockets based on a wildcard subdomain in rails 3.1?如何根据 rails 3.1 中的通配符子域将资产搜索路径添加到 Sprockets?
【发布时间】:2011-11-22 04:51:46
【问题描述】:

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)

【问题讨论】:

  • 资产管道并不是真的要编译生产中的每个请求的资产。它非常适合开发,但您应该将它们编译为静态文件以进行生产。因此,您需要为此开发自己的系统(也许是一个提供 CSS 文件的控制器?)或单独构建您的应用程序。

标签: ruby-on-rails ruby-on-rails-3.1 assets sprockets asset-pipeline


【解决方案1】:

我同意评论者对您的问题的看法,即“资产管道并不是真的要在生产中的每个请求中编译您的资产。” -- 让你无法真正做到完全你所要求的。

那么,如何使用另一种方法来完成您在此处真正想要完成的工作,即针对不同子域进行不同的资产解析。将您的子域特定资产放在资产文件夹的子目录中。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    我在看Railscasts #279 Understanding the Asset Pipeline时想到了这个想法

    【讨论】:

    • 嗯,很确定更改 Rails.application.config.assets.paths 将为整个应用程序永久添加路径,而不仅仅是当前请求。它就在您对 Rails.application 的调用中。 AS 与 prepend_view_paths 相反,它被记录为仅影响当前请求。所以 OP 的问题是你是否可以为asset_paths 做类似的事情......但Rails.application 不是。不过,查看 prepend_view_paths 的代码可能会让您了解如何自己破解它。
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    相关资源
    最近更新 更多