Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails: 複数DB利用時のDeviseのActiveRecord::ReadOnlyErrorに対応するメモ

認証にDeviseを利用しているとロック解除等のメールに送信されたLinkをクリックといったGETリクエストでDBを更新するような処理実行時にRailsの複数DBを使っているとActiveRecord::ReadOnlyErrorが発生してしまうため、そのあたりの対応方法をメモ📝

railsguides.jp

対応方法

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を切り変えたいケースでなければ良いのかなと・・・!

参考

github.com