Skip to content

Instantly share code, notes, and snippets.

@dborovsky
Forked from Mehonoshin/test.rb
Last active July 16, 2021 08:50
Show Gist options
  • Save dborovsky/f99ca5e31da9c44f877f7b68b24b6350 to your computer and use it in GitHub Desktop.
Save dborovsky/f99ca5e31da9c44f877f7b68b24b6350 to your computer and use it in GitHub Desktop.
class BasketController
def add_to_basket
#здесь искать по названию плохая идея, стоит по id
# как то так:
item = Item.find(params[:id])
#item = Item.find_by_title(params[:item_title])
# здесь используюется глобальная перменная.
# Плохая практика их использовать
#поэтому стоить определить какой то вспомогательный метод, можн его задать как helper метод или в private вынести, что я и сделал.
#basket = $basket
basket = current_basket
basket.add_item(item)
#мы добавили ошибку, но экшен до конца все равно выполнится и новый продукт будет добавлен
#здесь можно после добавления ошибки поставить например redirect :back
if basket.count_items > 10
basket.error_messages.add("Слишком много товаров в корзине")
redirect :back
end
total = 0
#я бы это дело вынес например в модель Basket, как метод экземпляра, например total
# и дальше если нам нужен итого сумма, где нужно, вызовем basket.total
basket.items.each do |basket_item|
total += basket_item.price
end
#сессию мы будем хранить по id корзины
#session[:basket_total] = total
session[:basket_id] = basket.id
#честно не понимаю, зачем здесь использовать голый sql, если можем обойтись ActiveRecords
query = "INSERT INTO basket_items (basket_id, item_title, basket_type) VALUES '" +
(:basket=>basket_id.to_s) +
"', '" + params[:item_title] + "', 3)"
results = ActiveRecord::Base.connection.execute(query)
#как то так
basket.basket_items.add(item)
# я думаю вполне можно так, только наверное надо условием проверить если общая сумма больше такой то, значит бесплатная доставка
Basket.add_free_delivery(basket) if basket.total > 100
#из экшена возвращать html вижу впервый раз. Не бэст практис. На вьюшку мы должны дальше передать просто наши данные.
#Например можно было сделать так:
#return "<h1>Добавлен товар в корзину: #{@item.title}</h1>"
if basket.save
render partial: 'baskets/render_views_basket', locals: { order: basket }
else
flash[:error] = 'There was a problem adding this item to your shopping basket.'
return :back
end
end
#добавил приватный метод current_busket
private
def current_busket
if !session[:basket_id].nil?
Basket.find(session[:basket_id])
else
Basket.new
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment