弊社では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’ みたいな感じですね。