我正在尝试在Rails 4应用程序中创建一个API,以允许其他应用程序创建记录。记录是根据其他应用程序知道的内容创建的,但是需要保存的实际数据有些不同。在用于创建新记录之前,我需要操纵参数。
我的模特:
class Product
include Mongoid::Document
include Mongoid::Timestamps
field :prod_code, type: String
field :batch_id, type: BSON::ObjectId
field :assy_lot_id, type: BSON::ObjectId
field :assy_lot_sn, type: String
belongs_to :assy_lot
belongs_to :batch
end
API控制器
module Api
module V1
class ProductsController < ActionController::Base
before_filter :restrict_access
respond_to :json
def create
variant_id = Variant.find(variant: params[:product]["variant"]).first
assy_lot_id = AssyLot.find(assy_lot: params[:product]["assy_lot"],variant_id: variant_id).first
params[:product][:prod_code]=params[:product]["variant"] + "-" + params[:product]["assy_lot"] + "-" + params[:product]["assy_lot_sn"]
params[:product][:batch_id]=Batch.find(assy_lot_id: assy_lot_id).first
params[:product][:assy_lot_id]=assy_lot_id
params[:product].delete "variant"
respond_with Chip.create(params[:product])
end
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.where(access_token: token).exists?
end
end
end
end
end
当我使用curl测试API时
curl -v http://localhost:3000/api/v1/chips.json -H 'Authorization:Token token="xxxxxxxxx"' -X POST -d '{"variant":"NA","assy_lot":"004","assy_lot_sn":"0001"}'
它连接OK,但我得到了
undefined method `[]' for nil:NilClass
对于我尝试访问para中的值的任何行,如params[:product]["something"]
有人可以指出正确的语法,这将允许我检查params中传递的值并更改它们。
提前致谢。
答案 0 :(得分:1)
您是否应该使用产品&#39;?上的参数发送您的请求?试试这个:
curl -v http://localhost:3000/api/v1/chips.json -H 'Authorization:Token token="xxxxxxxxx"' -X POST -d 'product: {"variant":"NA","assy_lot":"004","assy_lot_sn":"0001"}'
答案 1 :(得分:1)
您正在以错误的方式使用curl命令。要通过curl传递数据,您应该写
curl -v http://localhost:3000/api/v1/chips.json -H 'Authorization:Token token="xxxxxxxxx"' -X POST -d "variant=NA&assy_lot=004&assy_lot_sn=0001"
这会将params发送到rails
{'variant': 'NA', 'assy_lot: 004', 'assy_lot_sn': '0001'}
这将允许您在控制器内访问变体params['variant']
。
如果要在控制器内访问变量params[:product]["variant"]
,则必须在curl命令中传递数据,如下所示。
curl -v http://localhost:3000/api/v1/chips.json -H 'Authorization:Token token="xxxxxxxxx"' -X POST -d "product[variant]=NA&product[assy_lot]=004&product[assy_lot_sn]=0001"