開発環境
エラー内容
ActionCableを用いたチャット機能を実装しようと、以下の実装の手順を書いてくれている記事を参考に進めていたのですが、テキストを送信しても実行されずサーバーログを確認してみると、
「ArgumentError - wrong number of arguments (given 1, expected 2)」
となっており、直訳すると「2つの引数が渡されるのを期待しているが、1つの引数しか渡されていない」というエラーが発生していました。
そこでエラー箇所を確認してみるも以下のようにActionCable.server.broadcast
には、room_channel
とmessage: data['message']
が引数として2つとして渡されているように見えますし、ネットを調べても、ChatGPTに尋ねてもほとんど情報が得られませんでした。
class RoomChannel < ApplicationCable::Channel
# 省略
def speak(data)
ActionCable.server.broadcast 'room_channel', message: data['message']
end
end
【参考】実装手順の記事
- 【Rails6.0】ActionCableを使用したライブチャットアプリを実装する手順を解説
- 【Rails6.0】ActionCableとDeviseの欲張りセットでリアルタイムチャット作成(改正版)
解決方法
- 変更前
ActionCable.server.broadcast 'room_channel', message: data['message']
- 変更後
ActionCable.server.broadcast 'room_channel', {message: data['message']}
キーにシンボルを利用したハッシュであるmessage: data['message']
を「{}」で囲みました。
-
変更前
どうやら変更前の形式では、Rubyはこれをハッシュではなくキーワード引数
として解釈していたようです。
そうすると、ActionCable.server.broadcast
メソッドから見ると2つ目の引数として、データ型がハッシュの値を期待していたにも関わらず、期待しているデータ型ではなかったため「nil」
と解釈され、引数が1つしか渡されていない状態になったと考えられます。 -
変更後
明示的に{}で囲むことでハッシュとして認識され、broadcastメソッドには2つの引数が渡されたと解釈したため、エラーが発生せずに正常に動作しました。
終わりに
他の方ができているのになぜ今回ここでエラーとなったのか判明できていないですが、Rubyのメソッド呼び出しにおけるキーワード引数とハッシュの記法が似ているために今回のエラーが起きたと考えられます。
今後、ハッシュを引数として渡したい場合は、常に{}で囲むことにより明示的にハッシュであることを示していきたいと思います!
今回のエラー解決にかなり時間がかかったので、同じようなエラーで困っている方の助けに少しでもなればと思います
5. 参考文献
- ググり続けて、こちらの記事よりようやく解決法が得られました。ありがとうございました!