Проблема создания заказа с 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
модель.