在我的一个控制器操作结束时,我需要重定向到只接受put请求的页面。我一直试图弄清楚如何让redirect_to使用put请求但没有成功。
这可能吗?或者还有另一种方法可以实现这一目标吗?
答案 0 :(得分:5)
我认为你无法做到这一点,我怀疑这个限制是HTTP本身的一部分。
使用 redirect_to 时 - 除非在参数中另有规定,否则重定向将作为“302 Moved”标题发生。
查看HTTP Spec本身并没有发现任何改变浏览器通过重定向发出的请求类型的方法。
此类状态代码表示 需要采取进一步行动 由用户代理以实现 请求。需要采取的行动可能 由用户代理执行 如果没有与用户交互 并且只有在使用的方法中 第二个请求是GET或HEAD。
我认为您可能需要使用JavaScript来实现此功能,或者可能需要重新考虑应用程序中的控制流。
答案 1 :(得分:3)
如果操作与您尝试重定向的控制器位于同一控制器中,只需调用操作并渲染模板,如下所示:
def show
index
render :action => "index"
end
如果不是,那我就不知道你是怎么做的。
答案 2 :(得分: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
参数的表单。所以它有点hackish但它完成了工作。
此外,您必须确保在调用redirect_post
时哈希值是字符串,否则将引发错误。
答案 3 :(得分:1)
您可以重定向到另一个页面,该页面会发出来自客户端{42}的投放请求。