Подтвердить что ты не робот

Redirect_to от "destroy" до "index"

Проблема возникает, когда я хочу удалить элемент из разбитой на страницы таблицы с помощью "ajaxized". Контроллер моих задач вызывает метод destroy в ответ на [DELETE] /tasks/1234, но в конце я хочу перенаправить на индекс, чтобы автоматически обновить список.

К сожалению, то, что redirect_to tasks_url в этой точке делает запрос [DELETE] /tasks.

Есть ли способ заставить GET-запрос вместо DELETE при перенаправлении изнутри уничтожить?

4b9b3361

Ответ 1

Хорошо, поэтому подведем итог этому вопросу. Самый простой способ, который я нашел, чтобы исправить эту проблему, заключается в том, чтобы портить бит в route.rb, добавив: "tasks" => "tasks#index", :via => :get и использовать redirect_to tasks_url (в моем случае) непосредственно в уничтожении действия в контроллере.

Это также решит проблему с пейджером kaminari (что в некоторых случаях делает странные ссылки).

Ответ 2

Использовать redirect_to со статусом 303

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

Если вы используете запросы XHR, отличные от GET или POST, и перенаправляете после запроса, некоторые браузеры будут следовать за перенаправлением с использованием исходного метода запроса. Это может привести к нежелательному поведению, например двойному DELETE. Чтобы обойти это, вы можете вернуть код статуса 303 See, который будет следовать с использованием запроса GET.

Ответ 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

Ответ 4

Я думаю, вы должны изменить свой код на стороне клиента:

  • Запоминать текущую страницу
  • fire destroy действие, ожидание true или false
  • запрос index на запомненной странице с помощью вызова ajax.

Ответ 5

Почему бы не использовать: action param?

def destroy
  @task = Task.find(params[:id])
  @task.destroy
  redirect_to :action => :index    
end

Ответ 6

Вероятно, вы не хотите выполнять перенаправление стандартных рельсов при использовании ajax. Это сообщение в блоге содержит некоторое представление о проблеме и решениях. Обратите внимание, что это из аналогичного вопроса в январе, на который ответил DGM