Rails中每个子域的不同资产

时间:2018-05-24 14:12:45

标签: ruby-on-rails ruby amazon-s3 assets sprockets

所以我正在构建一个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上加载来自该子文件夹的资产,依此类推每个品牌。这可能吗?

0 个答案:

没有答案