所以我正在构建一个Rails应用程序,该应用程序将根据子域提供不同的内容。
应用程序将始终处于活动状态,当我们要发布新品牌(子域名)时,请说newbrand.example.com
,我们将使用Sprockets打包该品牌的资产,然后将其转储到S3(子域名为子文件夹名称,例如/brand/assets/...
和/newbrand/assets/...
)。
资产和区域设置将是每个子域更改的唯一内容,我已经为区域设置提供了一个干净的解决方案(使用i18n-active_record
gem),但我对每个子域的不同资产感到难过。
我有一些自定义代码挂钩到Sprockets并打包资产目录并创建必要的清单文件等:
env = Sprockets::Environment.new
# manifest.compile fails when the below method isn't present
env.context_class.class_eval do
def asset_path(path, options = {})
end
end
%w[config fonts images javascripts stylesheets].each do |folder|
Sprockets.append_path(File.join(Dir.pwd, 'assets', folder))
end
manifest = Sprockets::Manifest.new(env, File.join(Dir.pwd, 'compiled'))
assets = [%w[**/*.jpeg **/*.jpg **/*.svg **/*.png **/*.gif], ['**/*.js'], /(?:\/|\\|\A)application\.(css|js)$/]
manifest.compile(assets)
这个想法是在后台,这个预编译的资源文件夹将通过一个单独的任务发送给S3。
我的问题是,在访问不同的子域时,我无法让Rails查找新资产。
我通过子域切换asset_host的方法是执行以下操作:
config.action_controller.asset_host = Proc.new { |source, request|
"http://example.s3.amazonaws.com/#{request.subdomain}/"
}
因此,当我访问newbrand.example.com
时,我希望它在S3上加载来自该子文件夹的资产,依此类推每个品牌。这可能吗?