Действие Redirect_to от Destroy всегда получает DELETE-глагол: метод, который я объявляю
У меня есть следующий метод в контроллере с именем tareas_controller
def destroy
@tarea = Tarea.find(params[:id])
@tarea.destroy
respond_to do |format|
format.html { redirect_to tareas_url }
format.json { head :ok }
format.js { redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, :method=>:get}
end
end
Запись удаляется ok, после этого я получаю следующий код на сервере:
Перенаправлено на http://127.0.0.1:3000/clientes/12.js?method=getЗавершено 302 Найдено в 174 мс
Начнется DELETE "/clientes/12.js?method=get" для 127.0.0.1 в 2012-05-06 19:20:07 +0200 Обработка ClientesController # destroy as Параметры JS: { "method" = > "get", "id" = > "12" } Cliente Load (0.0ms) SELECT "clientes" . * FROM "clientes" WHERE "clientes" . "Id" =? ПРЕДЕЛ 1 [[ "id", "12" ]] SQL (2.0ms) DELETE FROM "clientes" WHERE "clientes" . "id" =? [[ "id", 12]] Завершено 406 Не допускается в 131ms
Кажется, отправляет запрос с помощью DELETE-глагола новому контроллеру, и я не могу найти способ изменить его на запрос GET новому контроллеру.
Может кто-нибудь дать мне совет, как решить эту проблему?
Ответы
Ответ 1
Решено, хотя и не в хорошем смысле.
создан следующий маршрут:
match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete
то я переписал редирект как:
redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js
не очень чистое решение, но работает по назначению:)
Ответ 2
Вы должны перенаправить со статусом 303.
Если вы используете запросы XHR, отличные от GET или POST, и перенаправление после запроса затем некоторые браузеры будут следовать за перенаправлением, используя первоначальный метод запроса. Это может привести к нежелательному поведению например, двойной DELETE. Чтобы обойти это, вы можете вернуть код состояния 303 See Other
, который будет выполняться с использованием запроса GET.
redirect_to posts_url, status: :see_other
redirect_to action: 'index', status: 303
Источник: http://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to
Ответ 3
В журнале вы можете видеть, что параметр, передаваемый в строке запроса, является "методом".
Parameters: {"method"=>"get", "id"=>"12"}
Rails ожидает параметр, называемый "метод", чтобы определить глагол, поэтому, когда вы выполняете перенаправление, вам нужно убедиться, что это происходит явно:
redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get