Ruby on rails Rails 4:如何在创建之前在api控制器中操作参数

Ruby on rails Rails 4:如何在创建之前在api控制器中操作参数,ruby-on-rails,ruby-on-rails-4,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

我正在尝试在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
它连接正常,但我得到

undefined method `[]' for nil:NilClass
对于我尝试访问参数值的任何行,如so
params[:product][“something”]

有人能告诉我正确的语法吗?它允许我检查参数中传递的值并对其进行更改


提前感谢。

您不应该发送带有“产品”参数的请求吗?试试这个:

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"}'

您不应该发送带有“产品”参数的请求吗?试试这个:

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"}'

您以错误的方式使用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"
这将向rails发送params作为

{'variant': 'NA', 'assy_lot: 004', 'assy_lot_sn': '0001'}
这将允许您在控制器内以
params['variant']
的形式访问变量

如果您想在控制器内部以
params[:product][“variant”]
的形式访问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"

您以错误的方式使用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"
这将向rails发送params作为

{'variant': 'NA', 'assy_lot: 004', 'assy_lot_sn': '0001'}
这将允许您在控制器内以
params['variant']
的形式访问变量

如果您想在控制器内部以
params[:product][“variant”]
的形式访问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"

就这样。感谢您对如何使用和测试它的解释。我使用了第二种格式。很高兴听到@bartct就是这样。感谢您对如何使用和测试它的解释。我使用了第二种格式。很高兴听到@BartchTanks。我使用curl的方式肯定是错误的,但即使我提交了正确的参数,我也不知道如何正确获取参数@罗汉的回答让我走出了黑暗:德汉克斯。我使用curl的方式肯定是错误的,但即使我提交了正确的参数,我也不知道如何正确获取参数@罗汉的回答让我走出了黑暗:D