認証にDeviseを利用しているとロック解除等のメールに送信されたLinkをクリックといったGETリクエストでDBを更新するような処理実行時にRailsの複数DBを使っているとActiveRecord::ReadOnlyError
が発生してしまうため、そのあたりの対応方法をメモ📝
対応方法
Devise
が提供しているdevise_controller?メソッドを利用してDeviseのControllerであれば一律writingに接続するようにするConcernを用意してDevise.parent_controller
(デフォルトではApplicationController
)にincludeするようにしてみました。
module DeviseWritable extend ActiveSupport::Concern included do around_action :connected_to_writing, if: :devise_controller? end def connected_to_writing(&block) ActiveRecord::Base.connected_to(role: :writing, &block) end end class ApplicationController < ActionController::Base include DeviseWritable end
個別にDeviseのController及びModelをオーバーライドしてconnected_to
で接続先をwriteにしてあげてもいいのですが、影響範囲が結構広いため、そこまで厳密にRead/Writeを切り変えたいケースでなければ良いのかなと・・・!