24

我在名为的控制器中有以下方法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 Completed 302 发现在 174ms

2012-05-06 19:20:07 +0200 由 ClientesController#destroy 作为 JS 参数处理 127.0.0.1 开始 DELETE "/clientes/12.js?method=get": {"method"=>"get", "id"=>"12"} 客户负载 (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 Not Acceptable in 131ms

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

有人可以给我建议如何解决这个问题吗?

4

3 回答 3

42

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

如果您使用 GET 或 POST 以外的 XHR 请求并在请求之后进行重定向,则某些浏览器将使用原始请求方法跟随重定向。这可能会导致不良行为,例如双重删除。要解决此问题,您可以返回一个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

于 2014-01-07T18:19:21.793 回答
1

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

创建了以下路线:

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

然后我将重定向重写为:

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

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

于 2012-05-08T11:47:08.057 回答
0

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

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

Rails 期望一个名为“_method”的参数来确定动词,因此当您进行重定向时,您需要确保明确发生:

redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get
于 2012-05-06T17:25:53.050 回答