Rails APIのURLにクエリパラメータを含める

RailsでAPIを作っていると、様々なパラメータを順不同で渡したくなることがあります。例えば、ページ位置とかソート方法とか。そんなときはクエリパラメータをAPIのURLに含めると便利です。次のようなURLのハテナ以降の部分がクエリパラメータです。

http://api.example.com/debug?sort=asc&page=3

クエリパラメータの読み取り方をまとめます。

結論

  • クエリパラメータを一つづつ読み取るには、params[キー]を使用します。
  • クエリパラメータをまとめて取得したいときは、request.query_parameterを使用します。
  • クエリパラメータとして配列も渡せます。

ルーティング

ルーティングは、クエリパラメータを含めずに普通に定義します。

@route.rb

# /debug へのルーティングを定義
get 'debug', to: 'application#debug'

一つづつ読み取る

クエリパラメータを読み取る処理はコントローラに記述します。次のようなクエリパラメータのsortの値を読み取るにはparams[:キー]を使います。

URL

http://api.example.com/debug?sort=asc

コントローラにて、paramsでsortパラメータを読み取ります。

def debug
 unless params[:sort].blank?
  sort = params[:sort].to_s
 end
end

まとめて読み取る

可変個のクエリパラメータをまとめて取得するには、request.query_parameterを使用します。

URL

http://api.example.com/debug?sort=asc&fruit=apple&name=taro

コントローラにて、request.query_parametereachで回してパラメータを読み取ります。

def debug
 hash = {}
 request.query_parameters.each do |key, value|
  hash[key] = value.to_s
 end
end

配列を読み取る

クエリパラメータのキーに[]を付けると配列になります。

URL

http://api.example.com/debug?name[]=tom&name[]=jon&name[]=ema

コントローラにて、params[:name]を取得すると配列で取得できます。eachで回す必要はありません。

def debug
 unless params[:name].blank?
  name = params[:name]
 end
end

参考サイト

Rails: How to get all parameters from url? | stack overflow