13

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

不幸的是,redirect_to tasks_url此时做的是[DELETE] /tasks请求。

从destroy内部重定向时,有什么方法可以强制 GET 请求而不是 DELETE ?

4

6 回答 6

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 请求并在请求之后进行重定向,则某些浏览器将使用原始请求方法跟随重定向。这可能会导致不良行为,例如双重删除。要解决此问题,您可以返回 303 See Other 状态代码,随后将使用 GET 请求。

于 2013-09-22T23:14:31.833 回答
3

不要使用重定向。使用渲染。抽象将表数据获取到库模块中的功能,然后从索引和删除方法调用它,然后添加渲染调用,然后将渲染调用添加到删除方法,以便索引视图作为响应返回.

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
于 2012-05-13T03:33:22.263 回答
0

为什么不使用 :action 参数?

def destroy
  @task = Task.find(params[:id])
  @task.destroy
  redirect_to :action => :index    
end
于 2012-05-17T20:45:04.433 回答
0

使用 ajax 时,您可能不想执行标准的 rails 重定向。这篇博客文章对问题和解决方案有一些很好的见解。请注意,这是来自1 月份的一个类似问题,由DGM回答

于 2012-05-18T19:43:05.487 回答
0

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

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

于 2012-05-21T10:58:30.030 回答
0

我认为您应该在客户端重新排列代码:

  1. 记忆当前页面
  2. 触发destroy动作,等待真或假
  3. index使用 ajax 调用在记忆页面上请求。
于 2012-05-14T11:37:47.563 回答