2016-03-23 7 views
1

Ich habe ein Problem festgestellt, warum meine Update-Methode nicht die erforderlichen Argumente erhalten. Ich habe einen ähnlichen Test für die Show und die Payloads funktionieren. In diesem Szenario ist die betreffende Route die Rechnung/Rechnungsnummer/Reise/ID. Wenn Sie mir helfen können, den Fehler zu finden und irgendwelche Vorschläge zu geben, wie man diese Art von Problem in Zukunft beheben kann, wäre das großartig.Falsche Anzahl von Argumenten (1 für 2) für Update-Methode

Dies ist die Aktualisierungsmethode.

def update 
    if @trip.update(@trip.trip_id, trip_params) 
    head :no_content 
    else 
    render json: [@invoice, @trip].errors, status: :unprocessable_entity 
    end 
end 

Mit den folgenden privaten Methoden.

private 

    def set_trip 
    @trip = Trip.where(:invoice_id => params[:invoice_id], :trip_id => params[:id]) 
    end 

    def trip_params 
    params.require(:trip).permit(:trip_id, :depart_airport, :arrive_airport, :passenger_first_name, :passenger_last_name, :passenger_count, :departure_date, :merchant_id) 
    end 

    def load_invoice 
    @invoice = Invoice.find(params[:invoice_id]) 
    end 

end 

Mein fehlgeschlagener Test sieht so aus.

test "should update trip" do 
    put :update, invoice_id: @invoice.invoice_id, id: @trip, 
    trip: {arrive_airport: @trip.arrive_airport, 
    depart_airport: @trip.depart_airport, 
    departure_date: @trip.departure_date, 
    passenger_count: @trip.passenger_count, 
    passenger_first_name: @trip.passenger_first_name, 
    passenger_last_name: @trip.passenger_last_name} 
assert_response 204 
end 
+0

Nur um zu überprüfen, ist der Fehler 2 für 1 oder 1 für 2? Machen Sie Spott/Stubbing der Datensätze, die von der Datenbank geladen werden? –

Antwort

1

wenn Sie set_trip rufen in before_action dann update() Verfahren wie diese

def update 
    if @trip.update(trip_params) 
    head :no_content 
    else 
    render json: [@invoice, @trip].errors, status: :unprocessable_entity 
    end 
end 

update() aussehen sollen, ist eine Instanz-Methode, das Objekt mit aufgerufen werden kann, müssen Sie nur trip_params hinein passieren, Hoffnung das hilft!

+0

Ich bin ein bisschen verwirrt. Warum fragt es mich nach zwei Argumenten, wenn ich nur eine geben darf? Ist es ein Problem mit meinem Test? – CheeseFry

+0

Verwirrend '@ trip' ist keine Instanz von Trip - es ist eine Beziehung und ActiveRecord :: Relation.update nimmt 2 Parameter. –

+0

@RSB Danke für das klare Beispiel. Ich denke, es wird wirklich hilfreich sein, wenn der Code so standardisiert wie möglich aussieht. – CheeseFry

1

Sie können diese Fehlermeldung erhalten, wenn die Methode eine andere aufruft, der die falsche Anzahl von Argumenten übergeben wird.

1

update nimmt einen Hash als einziges Argument, aber Sie übergeben zwei Argumente (@ trip.trip_id, trip_params) in der Update-Methode. Deshalb erhalten Sie die Fehlermeldung "Falsche Anzahl von Argumenten (1 für 2) für Update-Methode". Wie @RSB sagte, gib einfach trip_params weiter und die Trip-Instanz wird aktualisiert.

0

RSB war richtig auf das Geld. Es stellte sich in diesem Fall heraus, dass mein Problem auf der Datenbankebene lag. Die Tabelle hatte keinen Primärschlüssel, also benutzte ich @trip = Trip.where in der privaten Methode und dies führte dazu, dass es mit einem Array von möglichen Zeilen anstelle des spezifischen zurückgegeben wurde. Ich änderte Dinge auf der Datenbankebene, um einen Primärschlüssel zu haben und die private Methode zu aktualisieren. Voilà RSBs Code hat funktioniert!