Как вы можете заставить redirect_ использовать другой HTTP-запрос?
-
21-08-2019 - |
Вопрос
В конце одного из действий моего контроллера мне нужно перенаправить на страницу, которая принимает только запросы put.Я пытался выяснить, как заставить redirect_to использовать запрос put, но безуспешно.
Возможно ли это?Или есть другой способ добиться этого?
Решение 3
Итак, я нашел решение своей проблемы.Я нашел очень хорошую статью об этой ситуации здесь.Моя реализация выглядит примерно так:
private
def redirect_post(redirect_post_params)
controller_name = redirect_post_params[:controller]
controller = "#{controller_name.camelize}Controller".constantize
# Throw out existing params and merge the stored ones
request.parameters.reject! { true }
request.parameters.merge!(redirect_post_params)
controller.process(request, response)
if response.redirected_to
@performed_redirect = true
else
@performed_render = true
end
end
Затем я вызвал этот метод следующим образом:
redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token]
Таким образом, я смог "подделать" запрос put, сделав запрос post (используя redirect_post
), а затем присваивает 'put' a _method
параметр.Если вы посмотрите на обычный put
запрашивать все, что есть post
из формы с _method
параметр.Так что это немного халтурно, но свою работу выполняет.
Кроме того, вы должны убедиться, что, когда вы звоните redirect_post
значения вашего хэша являются строками, в противном случае будут выдаваться ошибки.
Другие советы
Я не думаю, что вы в состоянии это сделать, и я подозреваю, что ограничение является частью самого HTTP.
При использовании перенаправление_то - перенаправление выполняется как заголовок "302 перемещено", если в параметрах не указано иное.
Просмотр самой спецификации HTTP не показывает никакого способа изменить тип запроса, который браузер выполняет с помощью перенаправления.
Этот класс кода состояния указывает что агенту пользователя необходимо предпринять дальнейшие действия для выполнения запроса.Требуемое действие может осуществляется агента пользователя без взаимодействия с пользователем, если и только в случае, если метод, используемый в второй запрос GET или head.
Я думаю, вам, возможно, потребуется использовать JavaScript для достижения этой функциональности или, возможно, переосмыслить поток управления в вашем приложении.
Если действие находится в том же контроллере, откуда вы пытаетесь перенаправить, просто вызовите действие и отобразите шаблон следующим образом:
def show
index
render :action => "index"
end
Если это не так, то я не знаю, как вы это делаете.
Вы могли бы перенаправить на другую страницу, которая выдает запрос put от клиента, использование Javascript.