在Rails 4中更新API抛出参数缺失错误

时间:2016-07-11 05:45:08

标签: ruby-on-rails ruby api

我正在尝试学习并编写更新API并从小处着手我在API中传递了一个参数并尝试获得响应。

控制器:

  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'

我提供的网址链接是

  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生成的新手。请帮忙

2 个答案:

答案 0 :(得分:0)

这是由order_params方法引起的,其中您需要order(期望顺序为嵌套哈希),而您没有嵌套它。

您可以采取的方法是访问:

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

另外,我看到你正在设置@order实例变量,但在你的控制块(if @order.update_attributes)中,你正在使用一个局部变量,这会给你另一个错误。

我建议您浏览Hartl Tutorial,因为您可以从那里学到很多东西

<强>更新

根据评论中提到的新错误,我认为您应该访问:

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

这假设您的订单表基于正在设置的参数

有一列key

另外,将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

答案 1 :(得分: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

并使用网址跟随

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

这似乎可以解决问题