当我想以“ajaxized”方式从分页表中删除元素时出现问题。我的任务控制器调用它的destroy方法来响应[DELETE] /tasks/1234
,但最后我想重定向到索引以自动刷新列表。
不幸的是,redirect_to tasks_url
此时做的是[DELETE] /tasks
请求。
从destroy内部重定向时,有什么方法可以强制 GET 请求而不是 DELETE ?
当我想以“ajaxized”方式从分页表中删除元素时出现问题。我的任务控制器调用它的destroy方法来响应[DELETE] /tasks/1234
,但最后我想重定向到索引以自动刷新列表。
不幸的是,redirect_to tasks_url
此时做的是[DELETE] /tasks
请求。
从destroy内部重定向时,有什么方法可以强制 GET 请求而不是 DELETE ?
使用状态为 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 请求并在请求之后进行重定向,则某些浏览器将使用原始请求方法跟随重定向。这可能会导致不良行为,例如双重删除。要解决此问题,您可以返回 303 See Other 状态代码,随后将使用 GET 请求。
不要使用重定向。使用渲染。抽象将表数据获取到库模块中的功能,然后从索引和删除方法调用它,然后添加渲染调用,然后将渲染调用添加到删除方法,以便索引视图作为响应返回.
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
为什么不使用 :action 参数?
def destroy
@task = Task.find(params[:id])
@task.destroy
redirect_to :action => :index
end
好的,总结一下这个问题。我发现解决问题的最简单方法是在 routes.rb 中添加:并直接在控制器中的销毁操作中"tasks" => "tasks#index", :via => :get
使用(在我的情况下)。redirect_to tasks_url
这也将解决 kaminari 寻呼机的问题(在某些情况下会呈现奇怪的链接)。
我认为您应该在客户端重新排列代码:
destroy
动作,等待真或假index
使用 ajax 调用在记忆页面上请求。