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


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

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


10312
2018-03-21 23:45


起源



答案:


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

使用时 redirect_to的   - 除非在参数中另有规定,否则重定向将作为“302 Moved”标头发生。

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

HTTP重定向

此类状态代码表示   需要采取进一步行动   由用户代理以实现   请求。需要采取行动   由用户代理执行   如果没有与用户交互   并且只有在使用的方法中   第二个请求是GET或HEAD。

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


5
2018-03-22 01:05





如果操作与您尝试重定向的控制器位于同一控制器中,只需调用操作并呈现模板,如下所示:

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

如果不是,那么我不知道你是怎么做到的。


2
2018-03-22 06:01





好的,所以我找到了解决问题的方法。我发现了很好的情况 这里。我的实现看起来像这样:

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'分配给a _method PARAM。如果你看一个正常的 put 请求它是一个 post 从一个表格 _method PARAM。所以它有点hackish但它完成了工作。

此外,您必须确保在打电话时 redirect_post 哈希值是字符串,否则会抛出错误。


2
2018-03-22 18:57



controller.process 在导轨4中不再起作用 - josal


答案:


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

使用时 redirect_to的   - 除非在参数中另有规定,否则重定向将作为“302 Moved”标头发生。

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

HTTP重定向

此类状态代码表示   需要采取进一步行动   由用户代理以实现   请求。需要采取行动   由用户代理执行   如果没有与用户交互   并且只有在使用的方法中   第二个请求是GET或HEAD。

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


5
2018-03-22 01:05





如果操作与您尝试重定向的控制器位于同一控制器中,只需调用操作并呈现模板,如下所示:

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

如果不是,那么我不知道你是怎么做到的。


2
2018-03-22 06:01





好的,所以我找到了解决问题的方法。我发现了很好的情况 这里。我的实现看起来像这样:

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'分配给a _method PARAM。如果你看一个正常的 put 请求它是一个 post 从一个表格 _method PARAM。所以它有点hackish但它完成了工作。

此外,您必须确保在打电话时 redirect_post 哈希值是字符串,否则会抛出错误。


2
2018-03-22 18:57



controller.process 在导轨4中不再起作用 - josal


您可以重定向到从客户端发出put请求的其他页面, 使用Javascript


1
2018-03-22 00:22