Как вы можете сделать redirect_, чтобы использовать другой HTTP-запрос?
В конце одного из моих действий с контроллером мне нужно перенаправить на страницу, которая принимает только запросы на отправку. Я пытаюсь выяснить, как получить redirect_to для использования запроса на размещение, но без успеха.
Возможно ли это? Или есть другой способ сделать это?
Ответы
Ответ 1
Хорошо, поэтому я нашел решение своей проблемы. Я нашел очень хорошую запись о ситуации здесь. Моя реализация выглядит следующим образом:
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, сделав почтовый запрос (используя redirect_post
), а затем присвоив 'put' параметру _method
. Если вы посмотрите на обычный put
запрос, все это post
из формы с параметром _method
. Так что это немного хакерский, но он выполняет свою работу.
Кроме того, вы должны убедиться, что при вызове redirect_post
значения вашего хеша будут строками, иначе будут выданы ошибки.
Ответ 2
Я не думаю, что вы можете это сделать, и я подозреваю, что ограничение является частью самого HTTP.
При использовании redirect_to перенаправление происходит как заголовок "302 Moved", если в параметрах не указано иное.
Взгляд на сам HTTP-спецификатор не показывает какого-либо способа изменить тип запроса, который браузер делает с помощью перенаправления.
Переадресация HTTP:
Этот класс кода состояния указывает что необходимо предпринять дальнейшие действия пользовательским агентом для выполнения запрос. Действие необходимо МАЙ выполняться пользовательским агентом без взаимодействия с пользователем, если и только если метод, используемый в второй запрос - GET или HEAD.
Я думаю, вам может понадобиться использовать JavaScript для достижения этой функциональности или, возможно, пересмотреть поток управления в вашем приложении.
Ответ 3
Если действие находится на том же контроллере, где вы пытаетесь переадресовать, просто вызовите действие и создайте шаблон следующим образом:
def show
index
render :action => "index"
end
Если это не так, я не знаю, как вы это делаете.
Ответ 4
Вы можете перенаправить на другую страницу, которая выдает запрос на клик от клиента, с помощью Javascript.