Как вы можете сделать 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.