LoginSignup
0
0

【Rails7 / ActionCable / 備忘録】「ArgumentError - wrong number of arguments (given 1, expected 2)」に対するエラー対処(備忘録)

Last updated at Posted at 2023-07-24

開発環境

  • Ruby 3.2.2
  • Ruby on Rails 7.0.6
    image.png

エラー内容

ActionCableを用いたチャット機能を実装しようと、以下の実装の手順を書いてくれている記事を参考に進めていたのですが、テキストを送信しても実行されずサーバーログを確認してみると、
「ArgumentError - wrong number of arguments (given 1, expected 2)」
となっており、直訳すると「2つの引数が渡されるのを期待しているが、1つの引数しか渡されていない」というエラーが発生していました。
そこでエラー箇所を確認してみるも以下のようにActionCable.server.broadcastには、room_channelmessage: data['message']が引数として2つとして渡されているように見えますし、ネットを調べても、ChatGPTに尋ねてもほとんど情報が得られませんでした。

channels/room_channel.rb
class RoomChannel < ApplicationCable::Channel
    # 省略
  def speak(data)
    ActionCable.server.broadcast 'room_channel', message: data['message']
  end
end

【参考】実装手順の記事

解決方法

  • 変更前
room_channel.rb
ActionCable.server.broadcast 'room_channel', message: data['message']
  • 変更後
room_channel.rb
ActionCable.server.broadcast 'room_channel', {message: data['message']}

キーにシンボルを利用したハッシュであるmessage: data['message']を「{}」で囲みました。

  • 変更前
    どうやら変更前の形式では、Rubyはこれをハッシュではなくキーワード引数として解釈していたようです。
    そうすると、ActionCable.server.broadcastメソッドから見ると2つ目の引数として、データ型がハッシュの値を期待していたにも関わらず、期待しているデータ型ではなかったため「nil」と解釈され、引数が1つしか渡されていない状態になったと考えられます。

  • 変更後
    明示的に{}で囲むことでハッシュとして認識され、broadcastメソッドには2つの引数が渡されたと解釈したため、エラーが発生せずに正常に動作しました。

終わりに

他の方ができているのになぜ今回ここでエラーとなったのか判明できていないですが、Rubyのメソッド呼び出しにおけるキーワード引数とハッシュの記法が似ているために今回のエラーが起きたと考えられます。
今後、ハッシュを引数として渡したい場合は、常に{}で囲むことにより明示的にハッシュであることを示していきたいと思います!
今回のエラー解決にかなり時間がかかったので、同じようなエラーで困っている方の助けに少しでもなればと思います:wink:

5. 参考文献

  • ググり続けて、こちらの記事よりようやく解決法が得られました。ありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0