2016-03-23 66 views
1

我遇到問題追蹤爲什麼我的更新方法沒有得到所需的參數。我有一個類似的測試顯示和有效載荷工作。在這種情況下,有問題的路線是發票/ invoice_id/trip/id。如果您可以幫助我發現錯誤,並就如何在將來很好地解決這類問題提出任何建議。更新方法的參數數量錯誤(1代表2)

這是更新方法。

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

使用以下私有方法。

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 

我的失敗測試看起來像這樣。

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

只是爲了檢查,2是1還是1的錯誤2?你正在做從數據庫加載的記錄的任何模擬/存根? –

回答

1

如果要調用set_tripbefore_action然後update()方法應該是這樣的

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

update()是一個實例方法可以使用對象調用,您只需要通過trip_params進去,希望這有幫助!

+0

我有點不喜歡。爲什麼它要求我提供兩個參數,我應該只能通過一個參數。這是我的測試問題嗎? – CheeseFry

+0

令人困惑的是'@ trip'不是Trip的一個實例 - 它是一個關係,ActiveRecord :: Relation.update確實需要2個參數。 –

+0

@RSB感謝您的明確示例。我認爲讓代碼看起來儘可能標準化,這對於將來需要維護的人來說確實很有幫助。 – CheeseFry

1

當方法調用正在傳遞錯誤數量的參數的另一個方法時,您可能會收到此錯誤消息。

1

update將hash作爲其唯一的參數,但是您正在更新方法中傳遞兩個參數(@ trip.trip_id,trip_params)。這就是爲什麼你得到「錯誤數量的參數(1爲2)更新方法」錯誤消息。正如@RSB所說的,只需傳入trip_params,Trip實例就會被更新。

0

RSB是對的錢。原來在這種情況下,我的問題是在數據庫級別。該表沒有主鍵,所以我在私有方法中使用了 @trip = Trip.where,這導致它返回可能的行數組而不是特定的行。我在數據庫級別更改了一些主鍵並更新了私有方法。 VoilàRSB的代碼工作!

相關問題