redirect_to从“destroy”到“index”

时间:2012-04-12 10:44:35

标签: ruby-on-rails-3

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

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

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

6 个答案:

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

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

  1. 记住当前页面
  2. fire destroy动作,等待真或假
  3. 使用ajax调用在记忆页面上请求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寻呼机的问题(在某些情况下会出现奇怪的链接)。