Проблема создания заказа с Rails 5 в Woocommerce Rest API

У меня есть веб-приложение rails 5, которое пытается отправить заказ обратно на веб-сайт WordPress, используя API- интерфейс woo commerce.

Я использую обертку драгоценного камня:

gem "woocommerce_api"

Я могу идеально создать заказ, если жестко закодировать одну позицию. Однако я не знаю, как добавить несколько позиций. Ниже приведен первый "рабочий пример", а затем - моя попытка перебрать позиции.

Ответ об ошибке, который я получаю:

{"code"=>"woocommerce_rest_required_product_reference", "message"=>"Product ID or SKU is required.", "data"=>{"status"=>400}}

Очевидно, я не должен помещать в запрос цикл.each... Но я не знаю другого способа?

РАБОЧАЯ ПОЧТОВАЯ ЗАПРОС

@cart_items = Cart.where(user_id: @user.id).all

data = {
  status: "processing", 
  currency: "AUD",
  set_paid: true,
  billing: {
    first_name: "#{@user.first_name}",
    last_name: "#{@user.last_name}",
    address_1: "#{@user.address}",
    address_2: "",
    city: "#{@user.suburb}",
    state: "#{@user.state}",
    postcode: "#{@user.postcode}",
    country: "Australia",
    email: "#{@user.email}",
    phone: "#{@user.phone}"
  },
  shipping: {
    first_name: "#{@user.first_name}",
    last_name: "#{@user.last_name}",
    address_1: "#{@user.address}",
    address_2: "",
    city: "#{@user.suburb}",
    state: "#{@user.state}",
    postcode: "#{@user.postcode}",
    country: "Australia",
  },
  line_items: [
      {
        :product_id => 123,
        :variation_id => 1,
        :quantity => 2
        :subtotal => "10.00",
        :total => "20.00"
      }
  ],
  shipping_lines: [
    {
      method_id: "flat_rate",
      method_title: "Flat Rate",
      total: "0"
    }
  ]
}

НЕПРАВИЛЬНАЯ ЗАПРОС ПУНКТА НЕСКОЛЬКИХ ЛИН

@cart_items = Cart.where(user_id: @user.id).all

data = {
  status: "processing", 
  currency: "AUD",
  set_paid: true,
  billing: {
    first_name: "#{@user.first_name}",
    last_name: "#{@user.last_name}",
    address_1: "#{@user.address}",
    address_2: "",
    city: "#{@user.suburb}",
    state: "#{@user.state}",
    postcode: "#{@user.postcode}",
    country: "Australia",
    email: "#{@user.email}",
    phone: "#{@user.phone}"
  },
  shipping: {
    first_name: "#{@user.first_name}",
    last_name: "#{@user.last_name}",
    address_1: "#{@user.address}",
    address_2: "",
    city: "#{@user.suburb}",
    state: "#{@user.state}",
    postcode: "#{@user.postcode}",
    country: "Australia",
  },
  line_items: [
      @cart_items.each do |ci|
      {
        :product_id => ci.product.woo_id.to_i,
        :variation_id => 0,
        :subtotal => ci.product.price.to_s,
        :total => ((ci.product.price.to_d * ci.quantity.to_i).round(2)).to_s
      }
    end
  ],
  shipping_lines: [
    {
      method_id: "flat_rate",
      method_title: "Flat Rate",
      total: "0"
    }
  ]
}

1 ответ

Решение

Я считаю, что проблема связана с использованием each метод.

Самое главное помнить о each Метод заключается в том, что он не меняет возвращаемое значение. Это неявно возвращает исходный массив.

Посмотрите на map или же collect вместо этого методы, которые "создают новый массив, содержащий значения, возвращаемые блоком".

...
  line_items: @cart_items.map do |ci|
    {
      :product_id => ci.product.woo_id.to_i,
      :variation_id => 0,
      :subtotal => ci.product.price.to_s,
      :total => ((ci.product.price.to_d * ci.quantity.to_i).round(2)).to_s
    }
  end,
...

Однако, как вы сказали, использование методов в полезной нагрузке данных не очень удобно для чтения, поэтому я бы порекомендовал вам преобразовать это в переменную:

@line_items = ...map function here...
data: {
...
  line_items: @line_items
...

или в методе экземпляра в Cart модель.

Другие вопросы по тегам