我正在尝试学习并编写更新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生成的新手。请帮忙
答案 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
这似乎可以解决问题