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

Per*_*eoh 23 rest ruby-on-rails

我在名为的控制器中有以下方法 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
Run Code Online (Sandbox Code Playgroud)

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

重定向到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请求的方法.

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

seq*_*elo 34

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

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

  redirect_to posts_url, status: :see_other
  redirect_to action: 'index', status: 303
Run Code Online (Sandbox Code Playgroud)

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


Per*_*eoh 1

解决了,虽然不是很好。

创建了以下路线:

match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete 
Run Code Online (Sandbox Code Playgroud)

然后我将重定向重写为:

redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js
Run Code Online (Sandbox Code Playgroud)

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