-
-
Save dborovsky/f99ca5e31da9c44f877f7b68b24b6350 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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