我正在尝试学习和编写更新 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生成的新手。请帮忙
由order_params方法引起的,在该方法中,您需要order
(期望顺序是嵌套哈希),而您没有嵌套它。
您可以采取的一种方法是访问:
http://localhost:3000/api/v1/mobile/order_update?key=docket&order[id]=1
另外,我看到您正在设置@order
实例变量,但是在您的控制块( if @order.update_attributes
),您正在使用一个局部变量,这会给您带来另一个错误。
我建议您通过 Hartl 教程,因为您可以从那里学到很多东西
更新
根据评论中提到的新错误,我认为您应该访问:
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
我使用的解决方案如下
在我的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
这似乎可以解决问题