你怎么能让redirect_to使用不同的HTTP请求?

vri*_*h88 12 redirect ruby-on-rails http-request

在我的一个控制器操作结束时,我需要重定向到只接受put请求的页面.我一直试图弄清楚如何让redirect_to使用put请求但没有成功.

这可能吗?或者还有另一种方法来实现这一目标吗?

Tob*_*ede 5

我不认为你能做到这一点,我怀疑这个限制是HTTP本身的一部分.

使用redirect_to时 - 除非参数中另有指定,否则重定向将作为"302 Moved"标头发生.

看一下HTTP Spec本身并没有透露任何改变浏览器通过重定向发出的请求类型的方法.

HTTP重定向:

此类状态代码指示用户代理需要采取进一步操作才能完成请求.当且仅当第二个请求中使用的方法是GET或HEAD时,所需的操作可以由用户代理执行而不与用户交互.

我认为您可能需要使用JavaScript来实现此功能,或者可能需要重新考虑应用程序中的控制流.


vri*_*h88 2

好的,所以我找到了解决我的问题的方法。我发现一篇关于这里情况的很好的文章。我的实现如下所示:

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
Run Code Online (Sandbox Code Playgroud)

然后我这样调用这个方法:

  redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token]
Run Code Online (Sandbox Code Playgroud)

因此,我能够通过发出发布请求(使用redirect_post)然后将“放置”分配给_method参数来“伪造”放置请求。如果你看一下正常的put请求,它都是post来自带有参数的表单_method。所以它有点黑客,但它完成了工作。

另外,您必须确保当您调用redirect_post哈希值时,哈希值是字符串,否则将引发错误。