在我的一个控制器操作结束时,我需要重定向到一个只接受 put 请求的页面。我一直在试图弄清楚如何让 redirect_to 使用 put 请求但没有成功。
这可能吗?还是有另一种方法可以做到这一点?
在我的一个控制器操作结束时,我需要重定向到一个只接受 put 请求的页面。我一直在试图弄清楚如何让 redirect_to 使用 put 请求但没有成功。
这可能吗?还是有另一种方法可以做到这一点?
我认为您无法做到这一点,并且我怀疑限制是 HTTP 本身的一部分。
使用redirect_to时 - 除非参数中另有指定,否则重定向将作为“302 Moved”标头发生。
查看 HTTP 规范本身并没有揭示任何改变浏览器通过重定向发出的请求类型的方法。
此类状态码表明用户代理需要采取进一步的行动才能满足请求。当且仅当第二个请求中使用的方法是 GET 或 HEAD 时,用户代理可以执行所需的操作,而无需与用户交互。
我认为您可能需要使用 JavaScript 来实现此功能,或者重新考虑应用程序中的控制流。
如果该操作与您尝试重定向的控制器位于同一控制器中,只需调用该操作并呈现模板,如下所示:
def show
index
render :action => "index"
end
如果不是,那我不知道你是怎么做到的。
好的,所以我找到了解决问题的方法。我在这里找到了一篇很好的关于这种情况的文章。我的实现如下所示:
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
参数的表单。所以它有点hackish,但它完成了工作。
此外,您必须确保在调用redirect_post
哈希值时是字符串,否则将引发错误。
您可以使用 Javascript重定向到从客户端发出 put 请求的不同页面。