Использование вложенной формы для обновления и создания связанных элементов с проверкой - PullRequest
0 голосов
/ 30 января 2020

У меня есть форма заказа с ограничениями на количество элементов, которые вы можете выбрать, которая принимает вложенные атрибуты, и я хотел бы выполнить create и update для связанных элементов при обновлении заказа.

Моя форма выглядит следующим образом:

<%= simple_form_for @food_order do |f| %>
    <% @food_order.order_items.each do |oi| %>
        <%= f.fields_for :order_items, oi do |oi_form| %>
            <%= oi_form.input :quantity %>
        <% end -%>
    <% end -%>
<% end -%>

Мой валидатор выглядит так:

# OrderItem.rb
validate :food_order_quantity

def food_order_quantity
   if (order.limit - order.order_items.sum(:quantity)) < self.quantity
      errors.add(:base, "Too many products.  Please update your cart.")
   end
end

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

food_order = FoodOrder.create(limit: 10)
order_item_1 = OrderItem.create(order: food_order, quantity: 10)

Если я пытаюсь обновить заказ, уменьшив количество order_item_1 на 1 и добавив новый order_item с количеством 1, я получаю сообщение об ошибке, даже если общее количество верно:

order_item_1.quantity = 9
order_item_2 = OrderItem.new(order: food_order, quantity: 1)

put client_food_order_path(@client, food_order), params: { 
  food_order: {
    id: food_order.id,
    order_items_attributes: [
      order_item_1.attributes,
      order_item_2.attributes,
    ]
  }
}

# returns the following error
@messages={:"order_items.base"=>["Too many products.  Please update your cart."]}

Я понимаю, что пытается сохранить order_item_2 перед обновлением order_item_1, и в это время контроллер считает, что имеется 11 элементов (просто потому, что order_item_1 еще не обновлено).

Что я могу сделать, чтобы разрешить такую ​​операцию?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...