Я слежу за книгой Agile Веб-разработка с Rails 6 и в Главе 10: Умная тележка , мы должны построить тележку, которая будет принимать все ваши предметы в вашей тележке и объединяет их вместе, если у вас есть несколько одинаковых предметов, и показывает, сколько их у вас есть.
Мы создаем метод в классе Cart:
class Cart < ApplicationRecord
has_many :line_items, dependent: :destroy
def add_product(product)
current_item = line_items.find_by(product_id: product.id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product.id)
end
current_item
end
end
, который дает ошибку:
NoMethodError (undefined method `+' for nil:NilClass):
У нас есть класс, который создает line_items и позволяет нам добавить количество в LineItems:
class AddQuantityToLineItems < ActiveRecord::Migration[6.0]
def change
add_column :line_items, :quantity, :integer, default: 1
end
end
Вместе с классом для объединения элементов:
class CombineItemsInCart < ActiveRecord::Migration[6.0]
def up
# replace multiple items a single product in a cart with
# a single item
Cart.all.each do |cart|
#count products in the cart
sums = cart.line_items.group(:product_id).sum(:quantity)
sums.each do |product_id, quantity|
if quantity > 1
# remove individual items
cart.line_items.where(product_id: product_id).delete_all
# replace with a single item
item = cart.line_items.build(product_id: product_id)
item.quantity = quantity
item.save!
end
end
end
end
def down
LineItem.where("quantity>1").each do |line_item|
line_item.quantity.times do
LineItem.create(
cart_id: line_item.cart_id,
product_id: line_item.product_id,
quantity: 1,
)
end
line_item.destroy
end
end
end
Я сбит с толку, почему моя корзина не может взять количество и добавить к нему 1 , и он не будет отображаться в моем представлении, а это просто:
<% @cart.line_items.each do |item| %>
<li> <%= item.quantity %> × <%= item.product.title %></li>
<% end %>
Как лучше всего отображать и увеличивать количество элементов?