Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何根据rails 3.1中的通配符子域向链轮添加资产搜索路径?_Ruby On Rails_Ruby On Rails 3.1_Assets_Sprockets_Asset Pipeline - Fatal编程技术网

Ruby on rails 如何根据rails 3.1中的通配符子域向链轮添加资产搜索路径?

Ruby on rails 如何根据rails 3.1中的通配符子域向链轮添加资产搜索路径?,ruby-on-rails,ruby-on-rails-3.1,assets,sprockets,asset-pipeline,Ruby On Rails,Ruby On Rails 3.1,Assets,Sprockets,Asset Pipeline,指示您在config/application.rb中使用config.assets.path,但此时我无权访问请求的子域 我希望能够根据请求的子域预先设置一个额外的路径(仅适用于当前请求) 我的应用程序特定详细信息 这是一个基本的CMS应用程序。rootdomain.com主机使用标准控制器/视图呈现和默认资源路径处理管理部分 对subdomain.domain.com的请求根据subdomain呈现网站。它在过滤器之前的中调用prepend\u view\u path,并仅为当前请求添加Rai

指示您在
config/application.rb
中使用
config.assets.path
,但此时我无权访问请求的子域

我希望能够根据请求的子域预先设置一个额外的路径(仅适用于当前请求)

我的应用程序特定详细信息

这是一个基本的CMS应用程序。root
domain.com
主机使用标准控制器/视图呈现和默认资源路径处理管理部分

subdomain.domain.com
的请求根据
subdomain
呈现网站。它在过滤器之前的
中调用
prepend\u view\u path
,并仅为当前请求添加
Rails.root.join('vendor/sites/[subdomain]/templates')

当请求主机为
[subdomain].domain.com
时,我希望能够将
Rails.root.join('vendor/sites/[subdomain]/assets')
预先添加到链轮搜索路径

编辑

最后我加入了一个mixin for
Sprockets::Environment
,它覆盖了该方法:


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


我是在观看

节目时想到这一点的。我同意评论家对你的问题的看法,他们说“资产管道并不是真的要在生产中的每个请求中编译你的资产。”——这使得你不可能完全按照你的要求去做

那么,另一种方法如何实现您在这里真正想要实现的目标,即不同子域的不同资产解析。将特定于子域的资产放在资产文件夹的子目录中

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

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

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


但无论如何,遵循这种在显示时使用view/helper中的逻辑请求不同资产的方法。。。。将使您比最初建议的方法走得更远,这可能是不可能的

资产管道实际上并不打算在生产中的每个请求中编译您的资产。这对于开发来说很好,但是您应该将它们编译成静态文件以用于生产。因此,您需要为此开发您自己的系统(可能是一个提供CSS文件的控制器?)或单独构建您的应用程序。嗯,非常确定更改Rails.application.config.assets.path将永久性地为整个应用程序添加路径,而不仅仅是当前请求。它就在您对Rails.application的调用中。与prepend_view_路径相反,prepend_view_路径被记录为仅影响当前请求。所以OP的问题是,你是否可以为资产路径做类似的事情。。。但是Rails.application不是。查看prepend_view_路径的代码可能会让您了解如何自己破解它。
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)