Проблема создания заказа с Rails 5 в Woocommerce Rest API - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть веб-приложение 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 Ответ

0 голосов
/ 05 сентября 2018

Я считаю, что проблема связана с использованием метода 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.

...