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应用程序。rootdomain.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 forSprockets::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)