🐰

Rails で配列のクエリパラメータを受け取るには、渡す際のキーに[]を追記する

2024/01/09に公開

Ruby on Rails で REST API を開発しています。
配列のクエリパラメータを渡す場合について調べたので備忘録を残します。

要約

  • そもそも配列のクエリパラメータを渡す場合のルールが明確に定義されているわけではなく、言語やフレームワーク側で制御されている
  • 配列にしたいクエリパラメータに [] を追記する

そもそもの定義について

URI(URL) に関する標準ドキュメントである、RFC 3986 には配列のクエリパラメータを渡す際の作法について明確に定義されているわけではありません。

配列のクエリパラメータを渡す際の作法については、言語やフレームワークによって異なる制御がされているとのことです。

参考

https://zenn.dev/saka2jp/articles/1afb235f2db217
https://stackoverflow.com/questions/6243051/how-to-pass-an-array-within-a-query-string

Rails では、クエリパラメータに [] を追記する

タイトルのとおりです。

クライアント側でカンマ区切りの文字列を Rails API に渡して Rails 側で Split したりする方法は考え付きましたがなんとなくスマートじゃない気がしたので調べたところ Rails では以下のように制御を行っていることがわかりました。

# client
https://example.com/api/animals?names[]=cat&names[]=dog&names[]=sheep

上記のように、クエリパラメータに [](角かっこ)を付加して Rails 側に渡せば、配列として解釈してくれます。

# ruby
def index
  names = params[:names]
  # names -> ["cat", "dog", "sheep"]
end

また、この方法でクエリパラメータを受け取る場合、型推論や変換は行われず常に文字列となるため、注意が必要です。

https://railsguides.jp/action_controller_overview.html#ハッシュと配列のパラメータ

さいごに

[] で配列化する方法は PHPexpress(node.js) でも採用されている方法だそうです。
id=1&id=2&id=3 みたいに渡す方法しか使ったことがなかったので勉強になりました。

参考

https://datatracker.ietf.org/doc/html/rfc3986
https://zenn.dev/saka2jp/articles/1afb235f2db217
https://stackoverflow.com/questions/6243051/how-to-pass-an-array-within-a-query-string
https://railsguides.jp/action_controller_overview.html#ハッシュと配列のパラメータ

Discussion