【发布时间】:2009-03-21 23:45:48
【问题描述】:
在我的一个控制器操作结束时,我需要重定向到只接受 put 请求的页面。我一直在试图弄清楚如何让 redirect_to 使用 put 请求但没有成功。
这可能吗?还是有其他方法可以做到这一点?
【问题讨论】:
标签: ruby-on-rails redirect http-request
在我的一个控制器操作结束时,我需要重定向到只接受 put 请求的页面。我一直在试图弄清楚如何让 redirect_to 使用 put 请求但没有成功。
这可能吗?还是有其他方法可以做到这一点?
【问题讨论】:
标签: ruby-on-rails redirect http-request
我认为您无法做到这一点,并且我怀疑限制是 HTTP 本身的一部分。
当使用 redirect_to - 除非参数中另有指定,否则重定向会以“302 Moved”标头的形式发生。
查看 HTTP 规范本身并没有发现任何改变浏览器通过重定向发出的请求类型的方法。
此类状态码表示 需要采取进一步的行动 由用户代理来完成 请求。需要采取的行动 MAY 由用户代理执行 如果不与用户交互 并且仅当在 第二个请求是 GET 或 HEAD。
我认为您可能需要使用 JavaScript 来实现此功能,或者重新考虑应用程序中的控制流。
【讨论】:
如果该操作与您尝试重定向的控制器位于同一控制器中,只需调用该操作并呈现模板,如下所示:
def show
index
render :action => "index"
end
如果不是,那我不知道你是怎么做到的。
【讨论】:
好的,所以我找到了解决问题的方法。我发现了一篇关于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)来“伪造”一个放置请求,然后将“放置”分配给一个_method 参数。如果您查看普通的put 请求,那么它就是来自带有_method 参数的表单的post。所以它有点hackish,但它完成了工作。
另外,您必须确保当您调用 redirect_post 时,您的哈希值是字符串,否则会引发错误。
【讨论】:
controller.process 在 Rails 4 中不再工作
您可以重定向到另一个从客户端发出 put 请求的页面,using Javascript。
【讨论】: