#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 — мое предложение — просто игнорировать корзину, если она не активна — нарисуйте страницу так, как будто корзины нет…