В моем интернет-магазине мне бы хотелось, чтобы пользователь мог начать делать покупки без учетной записи, он мог выбирать товары и добавлять их в свою корзину.Он создал бы свою учетную запись непосредственно перед процессом оплаты, если у него еще нет учетной записи.
Также я хотел бы, чтобы заказ принадлежал пользователю
В моем order.rb Я добавил,
belongs_to :user, optional: true
Так что я могу создать order без user_id .Я обновляю заказ на user_id в методе создания платежа.Мне нужна эта ассоциация, потому что я хочу получать заказы пользователей.
В моем application_controller.rb У меня есть метод, который устанавливает корзину
before_action :current_cart
def current_cart
@current_cart ||= ShoppingCart.new(token: cart_token)
end
helper_method :current_cart
private
def cart_token
return @cart_token unless @cart_token.nil?
session[:cart_token] ||= SecureRandom.hex(8)
@cart_token = session[:cart_token]
end
Как только мой пользователь заплатил, его заказ записывается,Также я обнаружил, что, поскольку я не навязываю связь с пользователем и заказом, создается пустой заказ из-за текущей_карты в application_controller ...
здесь находится shopping_cart.rb модель
class ShoppingCart
delegate :sub_total, to: :order
def initialize(token:)
@token = token
end
def order
@order ||= Order.find_or_create_by(token: @token, status: 0) do |order|
order.sub_total = 0
end
end
def items_count
order.items.sum(:quantity)
end
def add_item(product_id:, quantity:1 , size_id:)
@product = Product.find(product_id)
@size = Size.find_by(id: size_id)
@order_item = if order.items.where(product_id: product_id).where(size_id: size_id).any?
order.items.find_by(product_id: product_id, size_id: size_id)
else
order.items.new(product_id: product_id, size_id: size_id)
end
@order_item.price = @product.price_cents
@order_item.quantity = quantity.to_i
ActiveRecord::Base.transaction do
@order_item.save
update_sub_total!
end
CartCleanupJob.set(wait: 1.minutes).perform_later(order.id)
end
def change_qty(id:, quantity:1, product_id:, size_id:)
@size = Size.find_by(id: size_id)
@order_item = order.items.find_by(product_id: product_id, size_id: size_id)
@order_item.quantity = quantity.to_i
@order_item.save
update_sub_total!
end
def remove_item(id:)
ActiveRecord::Base.transaction do
order.items.destroy(id)
update_sub_total!
end
end
private
def update_sub_total!
order.sub_total = order.items.sum('quantity * price')
order.save
end
end
Что мне делать, чтобы мой пользователь мог создать свою учетную запись прямо перед платежом, а не создать пустой заказ ...?