Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1: Action Cableコマンドにコネクションレベルのコールバックが追加(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

なお、#44696がmainブランチにマージされたのは2022/05/07です。

Rails 7.1: Action Cableコマンドにコネクションレベルのコールバックが追加(翻訳)

Action Cableでは個別のチャネルに以下のコールバックを追加できます。

  • after_subscribe
  • after_unsubscribe
  • before_subscribe
  • before_unsubscribe
  • on_subscribe
  • on_unsubscribe

Rails 7.1より前は、すべてのコマンドより前に呼び出されるコールバックを登録する一般的な方法がありませんでした。Rails 7.1では、コネクションレベルで登録されるコールバックのセットを提供する形でこの問題を解決しています。これらのコールバックは、どのチャネルのコマンドが呼び出されているかにかかわらず、あらゆるコマンドに対して呼び出されます。

新たに登録可能になったコールバックは以下のとおりです。

before_command
このコールバックは、コマンドがチャネルで処理される前のタイミングで呼び出されます。
around_command
このコールバックは、一般的にコマンドの実行前後に呼び出されます。yieldより前のコードは、実際のコマンドより前のタイミングで実行され、yieldより後のコードは、コマンドがチャネルで処理された後に実行されます。
after_command
このコールバックは、コマンドがチャネルで処理された後で呼び出されます。

この振る舞いをより深く理解するために、以下のサンプルコードを見てみましょう。

class Connection < ActionCable::Connection::Base
  identified_by :current_user
  before_command :set_current_user
  around_command :register_telemetry_data
  after_command :update_current_user

  private

    def set_current_user
      if request.params["user_id"].present?
        self.current_user = User.find_by(request.params["user_id"])
      end
      reject_unauthorized_connection if self.current_user.nil?
    end

    def register_telemetry_data
      self.current_user.register_telemetry({ start: true })
      yield
      self.current_user.register_telemetry({ end: true })
    end

    def update_current_user
      self.current_user.touch(:updated_at)
    end
end

上のset_current_userメソッドが呼び出されるタイミングは、すべてのコマンドが起動されるよりも前であることを想定しています。

同様に、update_current_userコマンドは、すべてのコマンドが処理された後で呼び出されることを想定しています。

register_telemetry_dataメソッドは、コマンドが実行される前にはself.current_user.register_telemetry({ start: true })を実行し、コマンドが実行された後ではself.current_user.register_telemetry({ end: true })を実行します。

詳しくは#44696をご覧ください。

関連記事

Rails 7.1: ActiveRecord::Baseにnormalizesが追加された(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。