14 Stimmen

Bitte ändern Sie die Weiterleitung von "destroy" auf "index".

Das Problem tritt auf, wenn ich ein Element aus einer paginierten Tabelle auf "ajaxisierte" Weise entfernen möchte. Mein Aufgaben-Controller ruft seine destroy Methode als Antwort auf [DELETE] /tasks/1234 auf, aber am Ende möchte ich mich umleiten lassen, um automatisch die Liste zu aktualisieren.

Leider bewirkt redirect_to tasks_url zu diesem Zeitpunkt eine [DELETE] /tasks Anfrage.

Gibt es eine Möglichkeit, einen GET-Request zu erzwingen, anstatt DELETE, während der Umleitung von innerhalb von destroy aus?

23voto

vitor.caetano Punkte 249

Verwenden Sie redirect_to mit Status 303

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

Die Dokumentation von redirect_to besagt:

http://api.rubyonrails.org/classes/ActionController/Redirecting.html

Wenn Sie XHR-Anfragen verwenden, die nicht GET oder POST sind und nach der Anfrage eine Umleitung durchführen, dann werden einige Browser die Umleitung mit der ursprünglichen Anfrage-Methode folgen. Dies kann zu unerwünschtem Verhalten führen, wie z.B. einem doppelten DELETE. Um dies zu umgehen, können Sie einen 303 Siehe Andere Statuscode zurückgeben, der mit einer GET-Anfrage verfolgt wird.

3voto

Reuben Punkte 53

Verwenden Sie keine Weiterleitung. Verwenden Sie render. Abstrahieren Sie die Funktionalität, um die Tabellendaten in ein Bibliotheksmodul zu erhalten, und rufen Sie diese dann sowohl von den Index- als auch von den Löschmethoden auf, und fügen Sie dann den Aufruf zum Rendern der Löschmethode hinzu, damit die Index-Ansicht zurückgesendet wird.

require 'myLibrary'
include myModule

def index
    getTableData
end

def destroy
    flash.now[:notice] = "Löschvorgang fehlgeschlagen" unless Task.destroy(params[:id])
    getTableData
    render 'myController/index'
end

in lib/myLibrary

module myModule
    def getTableData
        # Tabelle Foo hier
    end

1voto

Michal Punkte 647

Also, um diese Frage zusammenzufassen. Der einfachste Weg, den ich gefunden habe, um das Problem zu beheben, ist ein wenig in routes.rb zu jonglieren, indem man hinzufügt: "tasks" => "tasks#index", :via => :get und redirect_to tasks_url (in meinem Fall) direkt in der destroy Aktion im Controller zu verwenden.

Dies wird das Problem mit dem Kaminari Pager ebenfalls lösen (der in einigen Fällen seltsame Links rendern kann).

0voto

flooooo Punkte 709

Ich denke, Sie sollten Ihren Code auf der Client-Seite neu anordnen:

  1. Aktuelle Seite merken
  2. destroy Aktion ausführen, auf true oder false warten
  3. index auf der gemerkten Seite per Ajax aufrufen.

0voto

melekes Punkte 1863

Warum nicht den :action-Parameter verwenden?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X