我在名为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处理#dume as JS参数:{“method”=>“get”,“id”=>“12”} Cliente Load(0.0ms) SELECT“clientes”。* FROM“clientes”WHERE“clientes”。“id”=?限制1 [[“id”,“12”]] SQL(2.0ms)DELETE FROM“clientes”WHERE “clientes”。“id”=? [[“id”,12]]已完成406不可接受 131ms
似乎将带有DELETE谓词的请求发送到新控制器,我无法找到将其更改为对新控制器的GET请求的方法。
有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:34)
您应该使用状态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
答案 1 :(得分:1)
解决虽然不是很好..
创建了以下路线:
match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete
然后我重写了重定向:
redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js
不是一个非常干净的解决方案,但按预期工作:)
答案 2 :(得分:0)
您可以在日志中看到,查询字符串中传递的参数是“method”。
Parameters: {"method"=>"get", "id"=>"12"}
Rails期望一个名为“_method”的参数来确定动词,所以当你进行重定向时,你需要确保明确地发生这种情况:
redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get