ruby on rails route Un'azione Redirect_to from Destroy ottiene sempre il comando DELETE qualunque: metodo che dichiaro




routes resource rails (3)

Risolto anche se non in un modo carino ..

creato il seguente percorso:

match 'mostrar_cliente/:id' => 'clientes#show', :via => :delete 

poi ho riscritto il reindirizzamento come:

redirect_to "/mostrar_cliente/#{@tarea.cliente}", :format => :js

non è una soluzione molto pulita, ma funziona come previsto :)

Ho il seguente metodo in un controller chiamato 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

Il record viene cancellato ok, dopo di che ottengo il seguente codice sul server:

Reindirizzato a http://127.0.0.1:3000/clientes/12.js?method=get Completato 302 Trovato in 174 ms

Inizia DELETE "/clientes/12.js?method=get" per 127.0.0.1 alle 2012-05-06 19:20:07 +0200 Elaborazione per ClientesController # destroy come parametri JS: {"method" => "get", "id" => "12"} Cliente Load (0.0 ms) SELECT "client". * FROM "clientes" WHERE "clientes". "id" =? LIMIT 1 [["id", "12"]] SQL (2.0 ms) ELIMINA DA "client" DOVE "client". "Id" =? [["id", 12]] Completato 406 Non accettabile in 131 ms

Sembra che invii la richiesta con un verbo DELETE al nuovo controller e non riesco a trovare un modo per cambiarlo in una richiesta GET al nuovo controller.

Qualcuno può darmi consigli su come risolvere questo problema?


È possibile visualizzare nel registro che il parametro passato nella stringa di query è "metodo".

Parameters: {"method"=>"get", "id"=>"12"}

Rails si aspetta un parametro chiamato "_method" per determinare il verbo, quindi quando esegui il reindirizzamento devi assicurarti che ciò accada esplicitamente:

redirect_to :controller => "clientes", :action =>"show", :id => @tarea.cliente, :format => :js, '_method' =>:get

Dovresti reindirizzare con uno stato 303.

Se si utilizzano richieste XHR diverse da GET o POST e il reindirizzamento dopo la richiesta, alcuni browser seguiranno il reindirizzamento utilizzando il metodo di richiesta originale. Ciò potrebbe portare a comportamenti indesiderati come un doppio DELETE. Per ovviare a questo, è possibile restituire un 303 See Other codice di stato che verrà seguito utilizzando una richiesta GET.

  redirect_to posts_url, status: :see_other
  redirect_to action: 'index', status: 303

Fonte: http://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_to