Redirect_to от "destroy" до "index"
Проблема возникает, когда я хочу удалить элемент из разбитой на страницы таблицы с помощью "ajaxized". Контроллер моих задач вызывает метод destroy в ответ на [DELETE] /tasks/1234
, но в конце я хочу перенаправить на индекс, чтобы автоматически обновить список.
К сожалению, то, что redirect_to tasks_url
в этой точке делает запрос [DELETE] /tasks
.
Есть ли способ заставить GET-запрос вместо DELETE при перенаправлении изнутри уничтожить?
Ответы
Ответ 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