ruby-on-rails
Development

Railsで複数のasset_hostを動的に切り替える方法

弊社ではRailsアプリのproduction環境ではasset_syncを使ってs3にcssやjsを置くのが定番になっています(世間的に見てもそうかもしれないけど)

asset_syncを使った場合。静的ファイルのホストがRailsアプリと別になるので以下のようにasset_hostを設定します

# config/environments/production.rb
Rails.application.configure do
  config.action_controller.asset_host = '//s3-bucket-name.ap-northeast-1.amazonaws.com'
end

通常はこれで問題ないのですが、s3 bucketの別名を複数用意して静的ファイル読み込みの高速化を図るとか、物理的にデータが別のs3 bucketにあるから変えなきゃいけないなんてときに困ってしまいますよね。

最初はasset_pathをゴニョゴニョするのか…?なんて思ったんですがasset_hostにProcオブジェクトを設定するともとスマートに対応出来ました。

例として、/assets以下のリソースにアクセスする場合と、その他でs3 bucketを分ける場合は

# config/environments/production.rb
Rails.application.configure do
  config.action_controller.asset_host = proc { |source|
    bucket = source.include?('/assets') ? 'assets-bucket' : 'other-bucket'
    "//#{ bucket }.ap-northeast-1.amazonaws.com"
  }
end

引数のsourceはリクエストのパスが渡ってきます。この場合だと ‘/assets/application-87rfhsou4fo4.css’ みたいな感じですね。

標準