redirect_to从"destroy"到"index"

Mic*_*hal 13 ruby-on-rails-3

当我想以"ajaxized"方式从分页表中删除元素时出现问题.我的任务控制器调用其destroy方法响应[DELETE] /tasks/1234,但最后我想重定向到索引以自动刷新列表.

不幸的是,redirect_to tasks_url此时的要点是[DELETE] /tasks请求.

destroy内部重定向时,有没有办法强制GET请求而不是DELETE ?

小智 23

使用状态为303的redirect_to

def destroy
  @task = Task.find(params[:id])
  @task.destroy
  redirect_to :action => :index, status: 303     
end
Run Code Online (Sandbox Code Playgroud)

redirect_to文档说:

http://api.rubyonrails.org/classes/ActionController/Redirecting.html

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

  • 这是唯一正确的答案.不能再投票了.!! (3认同)

Mic*_*hal 1

好吧,总结一下这个问题。我发现解决这个问题的最简单方法是通过添加以下内容来弄乱routes.rb:并直接在控制器中的销毁操作中"tasks" => "tasks#index", :via => :get使用(在我的例子中)。redirect_to tasks_url

这也将解决 kaminari 寻呼机的问题(在某些情况下会呈现奇怪的链接)。