当我想以“ajaxized”方式从分页表中删除元素时出现问题。我的任务控制器调用其 destroy 方法来响应[DELETE] /tasks/1234
,但最后我想重定向到 index 以自动刷新列表。
不幸的是,此时redirect_to tasks_url
所做的是[DELETE] /tasks
请求。
从 destroy 内部重定向时,有没有办法强制GET请求而不是DELETE?
答案 0 :(得分:23)
使用状态为303的redirect_to
def destroy
@task = Task.find(params[:id])
@task.destroy
redirect_to :action => :index, status: 303
end
redirect_to文档说:
http://api.rubyonrails.org/classes/ActionController/Redirecting.html
如果您使用GET或POST以外的XHR请求并在请求后重定向,则某些浏览器将使用原始请求方法跟踪重定向。这可能会导致不良行为,例如双重DELETE。要解决此问题,您可以返回303参见其他状态代码,该代码将使用GET请求进行跟踪。
答案 1 :(得分:3)
不要使用重定向。使用渲染。摘要将表数据放入库模块然后从索引和删除方法中调用它的功能,然后添加然后将render调用添加到delete方法,以便索引视图作为响应发回的内容
require 'myLibrary'
include myModule
def index
getTableData
end
def destroy
flash.now[:notice] = "Delete operation failed" unless Task.destroy(params[:id])
getTableData
render 'myController/index'
end
lib / myLibrary中的
module myModule
def getTableData
# Table Foo here
end
end
答案 2 :(得分:0)
我认为您应该在客户端重新安排代码:
destroy
动作,等待真或假index
。答案 3 :(得分:0)
为什么不使用:action param?
def destroy
@task = Task.find(params[:id])
@task.destroy
redirect_to :action => :index
end
答案 4 :(得分:0)
使用ajax时,您可能不想进行标准的rails重定向。这个blog post对问题和解决方案有一些很好的见解。请注意,这是1月份的similar question,由DGM
回答答案 5 :(得分:0)
好的,总结一下这个问题。我找到解决问题的最简单方法是在routes.rb中添加:"tasks" => "tasks#index", :via => :get
以及在控制器中的destroy动作中直接使用redirect_to tasks_url
(在我的情况下)。
这也将解决kaminari寻呼机的问题(在某些情况下会出现奇怪的链接)。