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

標準
ruby-on-rails
Development

複数のRailsアプリで同じDBを使う場合にschema_migrationsを分ける方法

複数のRailsアプリで同じDBに接続する場合DBのマイグレーション履歴が同じschema_migrationsテーブルに格納されるのはちょっとこわい。

でもschema_migrationsって名前はRailsが決めているものだからどうやって変更するの?というのを調べたら接頭辞を使えばいいみたいで

# config/application.rb
module SampleApp
  class Application < Rails::Application
    ...
    config.active_record.table_name_prefix = 'sample_'
  end
end

上記のようにやっておくとアプリ全体のテーブル名にsample_が付くようになって、問題の箇所はsample_schema_migrationsというテーブル名になります。

ちなみにAdminユーザーテーブルを共有して同じアカウントでログイン出来るようにする場合は、sample_接頭辞をつけている側で

# app/models/admin.rb
class Admin < ActiveRecord::Base
  self.table_name_prefix = ''
end

というように個別モデル毎に接頭辞をなくしてあげることも出来るので複数アプリで同じテーブルを参照できますね。

ちなみにDeviseを使っているのでconfig/initializers/devise.rbでconfig.secret_keyを合わせてあげないとログインできませんでした。

多分複数アプリでschema_migrationsを共有しても問題なくて、rake db:migrate:statusすると存在しないmigrationの部分は ********** NO FILE ********** と表示されるだけなんだけどね。

標準