web-dev-qa-db-ja.com

Railsのルート:リダイレクトで「すべての」リクエストパラメータを渡す方法

リダイレクトすべてルートリクエスト/pages/home urlにしたいのですが、元のリクエストで使用されたすべてのパラメータを保持したいと思います。

そう:

http://myserver.com/?param1=value1&param2=value2

になる

http://myserver.com/pages/home?param1=value1&param2=value2

redirectでパラメータを渡すことに関するいくつかのSO質問がありますが、リクエストのパラメータの受け渡しに関連する質問は見つかりませんでした。

31
fguillen
# routes.rb
root :to => redirect { |params, request| "/pages/home?#{request.params.to_query}" }

アップデート1

request.paramsで遊んで、新しいpathを作成することもできます。

root :to => redirect { |params, request| "/pages/#{request.params[:page]}.html?#{request.params.to_query}" }
33
fguillen

もう1つの答えは機能しますが、パラメーターがない場合に備えて、最後に?を残します。

これは副作用なしでトリックを行うようです:

root to: redirect(path: '/quick_searches/new')

それが役に立てば幸い!

35
Kaukas

Rails 5では、リダイレクト内のパスコンポーネントのみを書き換えるだけで、これを簡潔に実行できるようになりました(したがって、元のクエリパラメータはすべて保持されます)。

# in routes.rb
root to: redirect(path: '/pages/home')

関連するドキュメントリンク:

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Redirection.html

10
Francis Li

Rails4に対する@fguillenの回答に基づいて構築

ルートには2行必要です。rb

# in routes.rb
match "/pages/home", to: 'pages#index', via: :get    
match "/", to: redirect{ |params, request| [ "/pages/home", request.env["rack.request.query_string"] ].join("?") }, via: :all

配列の結合は、パラメーターがない場合に備えて、最後にぶら下がっている疑問符も処理します。

1
Epigene