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

Действие 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 новому контроллеру.

Может кто-нибудь дать мне совет, как решить эту проблему?

4b9b3361

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