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

时间:2012-05-06 17:23:11

标签: ruby-on-rails rest

我在名为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请求的方法。

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

3 个答案:

答案 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