RailsでControllerのactionにリダイレクトする時は
redirect_to action: :index
のように書くものの、クエリストリング付でリダイレクトする時はどうすれば良いか調べた時のメモ。
環境
- Rails 6.1.4
対応
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が確認できます。