2012-04-12 2 views
13

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

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

Есть ли способ принудительного запроса GET вместо DELETE при перенаправлении изнутри destroy?

+0

Можете ли вы предоставить информацию из своего файла журнала для этого запроса перенаправления? – arnep

+0

Конечно, вот оно: [gist] (https: //gist.github.com/2369726) – Michal

+1

Примечание: У меня есть те же симптомы, что описаны и перечислены в приведенном выше тексте. Дополнительная точка данных: браузер Chrome говорит, что при перенаправлении он выдает 'GET', а не' DELETE'. Однако журналы Rails показывают, что вызов переадресации выполняется с помощью команды DELETE, как в приведенном выше значении. – SingleShot

ответ

0

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

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

+0

Aw ... Я не могу дать вам щедрость. Похоже, никто его не получил :( – SingleShot

+0

Не беспокойтесь, я рад, что смогу помочь вам :) – Michal

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 
+0

Спасибо - это обновляет список предметов должным образом. Тем не менее, мои 'will_paginate' ссылки после этого говорят, например,'/tasks/2? Page = 2' (что неправильно), а не '/ tasks? Page = 2'. Это происходит только после того, как ajaxed уничтожит, как описано выше. Мысли? – SingleShot

+0

Заметьте, я переключился с 'will_paginate' на' kanimari', чтобы узнать, уходит ли проблема с плохим URL-адресом. Negative. – SingleShot

+0

Извините, но нет ответа на эту часть, не зная, как ваше приложение объединяется. Если вы пытаетесь сделать это с помощью XHR, вам нужно будет изменить способ загрузки данных таблицы. Т.е. это не будет работать, если индекс загружает полную веб-страницу, но уничтожение - это только часть страницы, подлежащей обмену через вызов ajax. – Reuben

0

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

  1. Memorize текущей странице
  2. огня destroy действии, жду истинного или ложный
  3. запрос index на запомнившейся странице с помощью ajax cal л.
+0

Интересно - в основном «перенаправляй себя». Я закончил тем, что не переставлял код, как вы предлагали, и вместо этого использовал предложение Михала о специальном маршруте. Благодаря! – SingleShot

0

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

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

Это не сильно отличается от того, что мы уже делали. Переадресация будет получена браузером, браузер выдает 'GET' на' index', но рельсы будут использовать 'DELETE' вместо' GET'. Я считаю, что это ошибка в Rails. – SingleShot

+0

Извините, я думаю, что вы правы. К сожалению, у Rails нет метода forward() Symfony («Эти методы перенаправляют текущий запрос на другое действие без обратной связи с браузером»), поэтому стоит либо изменить маршрутизацию, либо использовать метод визуализации. – melekes

0

Возможно, вы не хотите перенаправлять стандартные рельсы при использовании ajax. Это blog post имеет хорошее представление о проблеме и решениях. Обратите внимание, что это от similar question в январе, ответил DGM

+0

Интересно. Вопреки тому, что описывает аналогичный вопрос, правильное перенаправление действительно происходит в моем случае - автоматически браузером. Разница в том, что рельсы не справляются с этим должным образом. Я решил проблему через специальный маршрут, предложенный одним из комментариев Михала. – SingleShot

23

Использование 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

Это единственный правильный ответ. Не могу продвинуть его больше. !! – Nerve

+1

Thanq так много спасенного времени ... – Agnes

+0

Я вижу успешное сообщение «перенаправлено» в терминале, но по какой-то причине оно не распространяется на мой браузер ... – divideByZero