Как сделать так, чтобы redirect_to использовал другой HTTP-запрос? - PullRequest
11 голосов
/ 22 марта 2009

В конце одного из моих действий контроллера мне нужно перенаправить на страницу, которая принимает только положенные запросы Я пытался выяснить, как заставить redirect_to использовать запрос пут, но безуспешно.

Возможно ли это? Или есть другой способ сделать это?

Ответы [ 4 ]

5 голосов
/ 22 марта 2009

Я не думаю, что вы можете сделать это, и я подозреваю, что ограничение является частью самого HTTP.

При использовании redirect_to - перенаправление происходит как заголовок "302 перемещено", если в параметрах не указано иное.

Просмотр самой спецификации HTTP не показывает способа изменить тип запроса, который браузер выполняет через перенаправление.

HTTP-перенаправления :

Этот класс кода состояния указывает что необходимо принять дальнейшие меры пользовательским агентом для того, чтобы выполнить запрос. Требуемое действие МОЖЕТ осуществляется пользовательским агентом без взаимодействия с пользователем, если и только если метод, используемый в Второй запрос - GET или HEAD.

Я думаю, что вам может понадобиться использовать JavaScript для достижения этой функциональности или, возможно, переосмыслить поток управления в вашем приложении.

3 голосов
/ 22 марта 2009

Если действие находится в том же контроллере, с которого вы пытаетесь перенаправить, просто вызовите действие и визуализируйте шаблон следующим образом:

def show
  index
  render :action => "index"
end

Если нет, то я не знаю, как ты это делаешь.

2 голосов
/ 22 марта 2009

Хорошо, я нашел решение своей проблемы. Я нашел очень хорошее описание ситуации здесь . Моя реализация выглядит так:

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]

Таким образом, я смог «подделать» запрос пут, сделав почтовый запрос (используя redirect_post), а затем присвоив «пут» параметру _method. Если вы посмотрите на обычный запрос put, то все это post из формы с параметром _method. Так что это немного хакерски, но это делает работу.

Кроме того, вы должны убедиться, что при вызове redirect_post значения вашего хэша являются строками, в противном случае будут выданы ошибки.

1 голос
/ 22 марта 2009

Вы можете перенаправить на другую страницу, которая выдает запрос на поставку от клиента, , используя Javascript .

...