Rails перенаправляет маршруты для строки запроса
У меня проблема, недавно изменилось имя контроллера.
Я изменил файл маршрутов для приема вызовов с использованием старого имени контроллера, для людей с закладками, ссылающихся на старое имя:
get '/old/about', to: redirect('/new/about')
get '/old/report/:client', to: redirect('/new/report/%{client}')
get '/old/:sub_path', to: redirect('/new/%{sub_path}')
работает отлично. Но для вызовов с строкой запроса она блокирует его /report/ 200. например:
/старый/отчет/200 c_id = 257 &? Конец = 2013-10-19 & num_results = 294540 & начать = 2013-10-13
он разрешает URL-адрес:
старый/отчет/200
и показывает мне ошибку из-за отсутствия параметров. Вы знаете, что я могу сделать? (Я думал, что строка sub_path в маршрутах поможет, но не): (
Ответы
Ответ 1
Вопрос, упомянутый Мэттом, помог мне разобраться в моем ответе (спасибо большое!). Это было немного другое для моего конкретного случая. Я оставляю ответ, который работал у меня в будущем.
match "/old/report/:client" => redirect{ |params, request| "/new/report/#{params[:client]}?#{request.query_string}" }
Ответ 2
Измените redirect
, чтобы использовать параметр path:
, чтобы сохранить запрос:
- get '/old/about', to: redirect('/new/about')
+ get '/old/about', to: redirect(path: '/new/about')
Это показано в документах API для redirect
, см. http://api.rubyonrails.org/classes/ActionDispatch/Routing/Redirection.html#method-i-redirect
Ответ 3
Основываясь на ответе Алехандры, более подробный, но без ?
, если нет строки запроса:
get "/old/report/:client", to: redirect{ |params, request| ["/new/report/#{params[:client]}", request.query_string.presence].compact.join('?') }
Итак, /old/report/:client?with=param
станет /new/report/:client?with=param
,
и /old/report/:client
станет /new/report/:client
.