2016-07-11 25 views
0

我想學習和編寫更新API,並開始小我在API中傳遞一個參數,並嘗試獲得響應。更新API拋出參數缺少錯誤在Rails 4

控制器:

module Api 
    module V1 
     class OrderApiController < ApiController 
     def order_update 
      response = Hash.new 
      result = Hash.new 
      @order = Order.find(params[:id]) 
      if @order.update_attributes(order_params) 
      result['order_id'] = order.id 
      response['result'] = result 
      response.merge! ApiStatusList::OK 
      else 
      response.merge! ApiStatusList::INVALID_REQUEST 
      end 
      render :json => response 
     end 

     private 

     def order_params 
      params.require(:order).permit(:id) 
     end 
     end 
    end 
end 

在routes.rb中的API路線爲:

match 'mobile/order_update' =>'order_api#order_update' 

URL鏈接我給的是

http://localhost:3000/api/v1/mobile/order_update?key=docket&id=1 

然而,這引發以下錯誤

ActionController::ParameterMissing at /api/v1/mobile/order_update 
       param is missing or the value is empty: order 

我不知道我在做什麼錯。我是Rails以及API生成的新手。請幫助

+0

我很抱歉,我提供的是錯誤的答案,我已經改寫了答案。 – krazedkrish

回答

0

這是由order_params方法引起的,其中您要求order(期望順序爲嵌套散列),而您並不嵌套它。

的一種方法,你可以採取的訪問:

http://localhost:3000/api/v1/mobile/order_update?key=docket&order[id]=1

而且,我看到你設置@order實例變量,但在你的控制塊(if @order.update_attributes),您使用的是局部變量這會給你另一個錯誤。

我建議你去通過Hartl Tutorial因爲有很多事情你可以根據在評論中提到的新的錯誤從那裏

UPDATE

學習,我想你應該寧可逛:

http://localhost:3000/api/v1/mobile/order_update?order[key]=docket&id=1

這是假設你的訂單表具有基於列key在PARAMS被設置

此外,改變你的order_params到:

 private 

    def order_params 
     params.require(:order).permit(:key) #since you cannot update a primary key, but I guess you want to update the key column 
    end 
+0

我意識到,早些時候並嘗試通過命令[id] = 1,但現在它拋出:ActiveRecord :: RecordNotFound在/ api/v1/mobile/order_update 無法找到與'id'=的順序。我檢查了我的控制檯並嘗試傳遞現有記錄,但它仍然會拋出相同的錯誤。 –

+0

你確定有'id'的訂單嗎? – oreoluwa

+0

是的,我甚至嘗試傳遞最後的訂單id,即order [id] = 87&order [service_id] = 8,它仍然會拋出相同的錯誤 –

0

我用的是如下

在我order_api_controller.rb,我已經改變了

def order_update 
     response = Hash.new 
     result = Hash.new 
     @order = Order.find(params[:id]) 
     if @order.update_attributes(order_params) 
     result['order_id'] = order.id 
     response['result'] = result 
     response.merge! ApiStatusList::OK 
     else 
     response.merge! ApiStatusList::INVALID_REQUEST 
     end 
     render :json => response 
    end 

的解決方案,編輯到此

 def order_update 
     response = Hash.new 
     result = Hash.new 
     debugger 
     @order = Order.find(params[:order][:id]) # passed the order symbol into params 
     if @order.update_attributes(order_params) 
      result['order_id'] = @order.id # Modified local variable to instance variable as per oreoluwa's suggestion 
      response['result'] = result 
      response.merge! ApiStatusList::OK 

     else 
      response.merge! ApiStatusList::INVALID_REQUEST 
     end 
     render :json => response 
    end 

和所使用的URL,如下

http://localhost:3000/api/v1/mobile/order_update?key=docket&order[id]=1 

這似乎這樣的伎倆