Rails 4:如何在创建

时间:2016-02-29 18:57:41

标签: ruby-on-rails ruby-on-rails-4

我正在尝试在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中传递的值并更改它们。

提前致谢。

2 个答案:

答案 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"