Новая корзина после завершения заказа

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

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

 :active, :boolean, :default true
  

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

 def show 
  @cart = Cart.find_by_id(session[:cart_id])
end

# GET /carts/new
def new
  @cart = Cart.create
    session[:cart_id] = @cart.id
    @cart
    redirect_to @cart
end
  

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

   def current_cart 
    Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    cart = Cart.create
    session[:cart_id] = cart.id
    cart
  end
  

после прохождения заказа у меня есть изменение столбца :active с true на false. Как я мог бы сделать так, чтобы, если current_cart.active? значение false создает новую корзину?

Я пробовал

    def current_cart 
     if Cart.find(session[:cart_id]).active? ==false
      cart = Cart.create
      session[:cart_id] = cart.id
     end
  rescue ActiveRecord::RecordNotFound
    cart = Cart.create
    session[:cart_id] = cart.id
    cart
  end
  

но мне казалось, что одновременно работают две тележки..

Обновить

Пробовал

     def current_cart 
     if Cart.find(session[:cart_id]).active? ==false
      reset_session
     else
      Cart.find(session[:cart_id])
    end
  

Безрезультатно..

Ответ №1:

Код, который вы пробовали, не возвращает Cart объект, если тот, который возвращается, Cart.find не активен — он возвращает cart.id . Самым простым решением было бы вернуть созданную корзину (как вы делаете в rescue предложении):

 def current_cart 
  cart = Cart.find(session[:cart_id])
  unless cart.active?
    cart = Cart.create
    session[:cart_id] = cart.id
  end
  cart
rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
  cart
end
  

Вы также должны высушить ее — до чего-то вроде:

 def current_cart 
  begin
    cart = Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    cart = nil
  end
  unless cart amp;amp; cart.active?
    cart = Cart.create
    session[:cart_id] = cart.id
  end
  cart
end
  

Если вы не хотите фактически создавать корзину в новом сценарии, используйте new вместо create :

 def current_cart 
  cart = Cart.find(session[:cart_id])
  unless cart.active?
    cart = Cart.new
  end
  cart
rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
  cart
end
  

Комментарии:

1. цель здесь в том, что после того, как я завершу заказ и вернусь в корзину, он должен сказать, что ваша корзина пуста. Моя корзина сохраняется с этим кодом.

2. У меня возникла неизвестная проблема, не уверен, как ее решить. Ваш код должен работать, но это не так… возможно, было бы лучше удалить сеанс, связанный с пользователем и корзиной … по завершении заказа.. является ли плохой практикой удаление данных сеанса? У меня уже есть тонны в БД.

3. @Peege151 — не было бы проще проверить, активна ли корзина в представлении ? Просто покажите пустую корзину, если она не активна…

4. Так и должно быть, я не уверен, почему это не работает. Я подтверждаю, что корзина НЕ активна в представлении (заказ уже выполнен), но она показывает ту же корзину. Есть идеи?

5. @Peege151 — мое предложение — просто игнорировать корзину, если она не активна — нарисуйте страницу так, как будто корзины нет…