将多个项目发布到 Rails API 时的强参数

Strong params when POSTing multiple items to Rails API

我正在尝试通过对 Rails API 的 POST 请求创建多条记录,但我遇到了参数方面的问题。

发生的情况是项目没有被创建,因为模型中的回调正在寻找不存在的值。我相信这与参数有关。

这是我的代码:

  def batch_create
    params[:product].each do |p|
      product = Product.new(batch_create_product_params)
      product.save
    end
    respond_to do |format|
      format.json { render json: @product }
    end
  end

  def batch_create_product_params
    params.permit(:name, :link, :category_old, :image_url, :price, :interest, :revenue, :end_date, :company, :country, :above_average_revenue)
  end

我的 json 调用的原始内容是:

{
    "product": [
        {
            "name": "Strap On SoftRack Roof Rack by Otium Acupressure",
            "link": "https://things.com/89902997836713867011111211111121/Strap-On-SoftRack-Roof-Rack-by-Otium",
            "category_old": "",
            "image_url": "https://thingd-media-ec1.com/default/899029978367138670_42120cf10765.jpg",
            "price": "160",
            "interest": "9999",
            "company": "ACME",
            "country": "USA",
            "revenue": "999999"
        },
        {
            "name": "Strap On SoftRack Roof Rack by Otium Acupressure 2",
            "link": "https://things.com/Strap-On-SoftRack-Roof-Rack-by-Otium",
            "category_old": "",
            "image_url": "https://thingd-media-ec1.com/default/899029978367138670_42120cf10765.jpg",
            "price": "160",
            "interest": "9999",
            "company": "ACME",
            "country": "USA",
            "revenue": "999999"
        }
    ]
}

得到的参数如下:

第一次调用时的总参数

Parameters: {"product"=>[{"name"=>"Strap On SoftRack Roof Rack by Otium Acupressure", "link"=>"https://fancy.com/things/89902997836713867011111211111121/Strap-On-SoftRack-Roof-Rack-by-Otium", "category_
old"=>"", "image_url"=>"https://thingd-media-ec1.thefancy.com/default/899029978367138670_42120cf10765.jpg", "price"=>"160", "interest"=>"9999", "company"=>"Fancy", "country"=>"USA", "revenue"=>"999999"},
{"name"=>"Strap On SoftRack Roof Rack by Otium Acupressure 2", "link"=>"https://fancy.com/things/Strap-On-SoftRack-Roof-Rack-by-Otium", "category_old"=>"", "image_url"=>"https://thingd-media-ec1.thefancy.
com/default/899029978367138670_42120cf10765.jpg", "price"=>"160", "interest"=>"9999", "company"=>"Fancy", "country"=>"USA", "revenue"=>"999999"}], "import"=>{}}

循环中的参数。

{"name"=>"Strap On SoftRack Roof Rack by Otium Acupressure", "link"=>"https://fancy.com/things/89902997836713867011111211111121/Strap-On-SoftRack-Roof-Rack-by-Otium", "category_old"=>"", "i
mage_url"=>"https://thingd-media-ec1.thefancy.com/default/899029978367138670_42120cf10765.jpg", "price"=>"160", "interest"=>"9999", "company"=>"Fancy", "country"=>"USA", "revenue"=>"999999"}

我相信您正在寻找的更像是这样。在 permit 调用中放置根 product 键告诉 rails 这将是一个对象数组,包含记录的键。

def batch_create
  batch_create_product_params[:product].each do |product_params|
    product = Product.new(product_params)
    product.save
  end
  respond_to do |format|
    format.json { render json: @product }
  end
end

def batch_create_product_params
  params.permit(product: [:name, :link, :category_old, :image_url, :price, :interest, :revenue, :end_date, :company, :country, :above_average_revenue])
end

我认为 new 不需要数组。我认为您需要这样做 - 在强参数中使用 p 参数。

  def batch_create
    params[:product].each do |p|
      product = Product.new(batch_create_product_params(p)) # Pass p
      product.save
    end
    respond_to do |format|
      format.json { render json: @product }
    end
  end

  def batch_create_product_params(p) # Accept params
    p.permit(:name, :link, :category_old, :image_url, :price, :interest, :revenue, :end_date, :company, :country, :above_average_revenue)
  end

create 确实需要一个数组。也许这适合你的情况。

def batch_create
  product = Product.create(batch_create_product_params[:product])
  respond_to do |format|
    format.json { render json: @product }
  end
end

def batch_create_product_params
  params.permit(product: [:name, :link, :category_old, :image_url, :price, :interest, :revenue, :end_date, :company, :country, :above_average_revenue])
end