Skip to content

Instantly share code, notes, and snippets.

@Hunk13
Forked from Mehonoshin/test.rb
Last active July 15, 2018 07:24
Show Gist options
  • Select an option

  • Save Hunk13/133118e939d7a9d9f523121e1690ba44 to your computer and use it in GitHub Desktop.

Select an option

Save Hunk13/133118e939d7a9d9f523121e1690ba44 to your computer and use it in GitHub Desktop.
# вроде должен наследовать от ApplicationController и название во множественном числе
# class BasketsController < ApplicationController
class BasketController
# метод очень большой, можно разложить частьи в модель, в приватные методы или совсем убрать
def add_to_basket
# Можно сделать приватный фильтр и поместить в before_action
# скорее всего поиск по параметру будет использоваться не только в этом методе
# еще параметром идет название и если в базе будет несколько одинаковых,
# то в item будет массив. Поэтому можно добавить к выборке .limit(1) или .first
# чтобы отобралось только одно значение
# а вообще лучше искать по :id, тогда не нужно никаких дополнительных обрезок
# саму переменную сделать переменной объекта @item
item = Item.find_by_title(params[:item_title])
# вообще использовать глобальные переменные не самый хороший стиль
# она может быть перезаписана из любого места программы и потом
# сложно отлавливать баги
# Можно передавать эту переменную в метод параметром add_to_basket(basket)
# @basket = basket
basket = $basket
# @basket.add_item(@item) и так далее, с @
basket.add_item(item)
# вся бизнес-логика должна быть по возможности в модели
if basket.count_items > 10
basket.error_messages.add("Слишком много товаров в корзине")
# если оставить этот метод здесь, то
# нужна какая-то реакция, выход в редактирование корзины,
# может смысла дальше выполнять метод никакого
end
# опять же, зачем в контроллере подсчет всей суммы? Это надо в модель
total = 0
basket.items.each do |basket_item|
total += basket_item.price
end
# в сессии лучше хранить не общую сумму, а :id корзины
session[:basket_total] = total
# М-м-м, это не очень хорошо. Есть же ActiveRecord, можно с помощью его все сделать
# переметры запроса передавать через strong parameters, чтобы обрезать допустимые параметры
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.add_free_delivery(basket)
# Нужно использовать вьюхи и шаблоны, так не очень хорошо.
return "<h1>Добавлен товар в корзину: #{@item.title}</h1>"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment