一个来自Destroy动作的Redirect_to总是得到DELETE动词:我声明的方法

我在名为tareas_controller的控制器中有以下方法

 def destroy @tarea = Tarea.find(params[:id]) @tarea.destroy respond_to do |format| format.html { redirect_to tareas_url } format.json { head :ok } format.js { redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, :method=>:get} end end 

记录被删除了,之后我在服务器上获得以下代码:

重定向到http://127.0.0.1:3000/clientes/12.js?method=get已完成302发现于174ms

在2012-05-06 19:20:07开始删除“/clientes/12.js?method=get”for 127.0.0.1 +0200由ClientesController处理#Drown作为JS参数:{“method”=>“get”, “id”=>“12”} Cliente Load(0.0ms)SELECT“clientes”。* FROM“clientes”WHERE“clientes”。“id”=? LIMIT 1 [[“id”,“12”]] SQL(2.0ms)DELETE FROM“clientes”WHERE“clientes”。“id”=? [[“id”,12]]已完成406在131ms内无法接受

它似乎将带有DELETE谓词的请求发送到新控制器,我无法找到将其更改为对新控制器的GET请求的方法。

有人可以告诉我如何解决这个问题吗?

您应该使用状态303重定向。

如果您正在使用GET或POST以外的XHR请求并在请求后重定向,则某些浏览器将使用原始请求方法跟踪重定向。 这可能会导致不良行为,例如双重DELETE。 要解决此问题,您可以返回303 See Other状态代码,使用GET请求将遵循该状态代码。

  redirect_to posts_url, status: :see_other redirect_to action: 'index', status: 303 

资料来源: http : //api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to

解决虽然不是很好的方式..

创建了以下路线:

 match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete 

然后我重写了重定向:

 redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js 

不是一个非常干净的解决方案,但按预期工作:)

您可以在日志中看到,查询字符串中传递的参数是“method”。

 Parameters: {"method"=>"get", "id"=>"12"} 

Rails期望一个名为“_method”的参数来确定动词,所以当你进行重定向时,你需要确保明确地发生这种情况:

 redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get