Railsにて、Controllerのactionにクエリストリング付でリダイレクトする

RailsでControllerのactionにリダイレクトする時は

redirect_to action: :index

のように書くものの、クエリストリング付でリダイレクトする時はどうすれば良いか調べた時のメモ。

 

環境

 

対応

redirect_to の引数を

def move_with_field
  redirect_to action: :index, ham: 'spam'
end

のように、actionの後ろへ ham: 'spam' な形で指定します。

 
例えば

Rails.application.routes.draw do
  get 'home/index'
  get 'home/move_with_field'

のようなroutes.rbの場合は、

http://localhost:3760/home/move_with_field

から

http://localhost:3760/home/index?ham=spam

へとリダイレクトします。

 
もし、リダイレクト時にクエリストリングも引き継ぎたい場合、

def move_with_unpermitted_params
  redirect_to action: :index, **params
end

としても、エラー unable to convert unpermitted parameters to hash になります。

 
そのため、Strong Parameterを使って

def move_with_permitted_params
  p = move_params
  redirect_to action: index, **p
end

private

def move_params
  params.permit(:foo, :bar)
end

とすることで、クエリストリングのうち許可されたキーのみを持って

http://localhost:3760/home/move_with_permitted_params?foo=1&bar=2&baz=3

から

http://localhost:3760/home/index?bar=2&foo=1

へとリダイレクトします。

 

ソースコード

Githubに上げました。
https://github.com/thinkAmi-sandbox/rails_routing_app

 
railsをポート 3760 で起動し、 % bin/rails print_redirect:run を実行すると、リダイレクト元と先のURLが確認できます。