пустая запись создана, как я могу это исправить? - PullRequest
0 голосов
/ 21 января 2019

В моем интернет-магазине мне бы хотелось, чтобы пользователь мог начать делать покупки без учетной записи, он мог выбирать товары и добавлять их в свою корзину.Он создал бы свою учетную запись непосредственно перед процессом оплаты, если у него еще нет учетной записи.

Также я хотел бы, чтобы заказ принадлежал пользователю

В моем 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

Что мне делать, чтобы мой пользователь мог создать свою учетную запись прямо перед платежом, а не создать пустой заказ ...?

1 Ответ

0 голосов
/ 21 января 2019

В методе заказа вашего класса ShoppingCart вы используете find_or_create_by, что, как следует из названия, вызывает метод create класса Order.Если вы переключитесь на find_or_initialize_by, вместо этого будет вызван метод new, который даст вам объект Order, но не будет создан в базе данных.

  def order
    @order ||= Order.find_or_initialize_by(token: @token, status: 0) do |order|
      order.sub_total = 0
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...