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をご覧ください。
概要
元サイトの許諾を得て翻訳・公開いたします。
なお、#44696がmainブランチにマージされたのは2022/05/07です。