2009-03-21 4 views
11

В конце одного из моих действий с контроллером мне нужно перенаправить на страницу, которая принимает только запросы на отправку. Я пытаюсь выяснить, как получить redirect_to для использования запроса на размещение, но без успеха.Как сделать redirect_, чтобы использовать другой HTTP-запрос?

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

ответ

2

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

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), а затем присваивая 'put' параметру _method. Если вы посмотрите на обычный запрос put, все это post из формы с параметром _method. Так что это немного хакерский, но он выполняет свою работу.

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

+1

'controller.process' больше не работает в рельсах 4 – josal

1

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

5

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

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

Взгляд на сам HTTP-спецификатор не показывает какого-либо способа изменить тип запроса, который браузер делает с помощью перенаправления.

HTTP Redirects:

Этот класс кода статуса указывает на то, что требует дальнейших действий, которые необходимо принять агентом пользователя для того, чтобы выполнить запрос. Требуемое действие должно быть выполнено , выполняемым пользовательским агентом без взаимодействия с пользователем, если , и только если метод, используемый в втором запросе , является GET или HEAD.

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

2

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

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

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