Навигация
Корзины и сессии
Итак, после того как мы прошлись по теории, пора вспомнить о том, где мы нахо¬димся на пути практического воплощения наших замыслов. Нам необходимо по¬лучить возможность сначала назначить сессии новый объект, представляющий
корзину, а затем разыскивать этот объект, когда это нужно будет для той же са¬мой сессии. Осуществить все это можно с помощью создания метода f i nd_cart в контроллере store. Простое (и исчерпывающее) воплощение выглядит так:
# если в сессии корзины нет,
# то нужно добавить новую
# возвращение уже существующей
# или новой корзины
def find_cart
unless session!:cart]
session[:cart] = Cart.new
end
session!:cart]
end
Следует помнить, что для контроллера текущая сессия в Rails похожа на хэш, поэтому мы будем хранить корзину в сессии, индексируя ее при помощи обозна¬чения : cart. Мы не знаем, чем станет наша корзина, поэтому пока будем считать, что это класс, то есть мы можем создать новый объект «корзина» (cart), исполь¬зуя выражение Cart. new. Вот теперь, вооружившись всей массой приобретенных знаний, мы можем организовать хранение корзины в пользовательской сессии.
Оказывается, для этого есть более свойственный для Ruby способ:
Листинг файла app/controllers/store_controller.rb private
def find_cart
sessiont:cart] ||= Cart.new
end
Этот метод похож на трюк. В нем используется принадлежащий Ruby услов¬ный оператор | | =. Если хэш сессии имеет значение, соответствующее ключу : cart, то это значение тут же и возвращается. В противном случае создается но¬вый объект, который назначается для этой сессии. А затем он же и возвращается.
Заметьте, что мы объявили для метода f ind_cart область определения private. Тем самым мы предотвратили для Rails доступ к нему как к действию контролле¬ра. Когда мы в дальнейшей работе над корзиной будем добавлять методы к это¬му контроллеру, будьте внимательны — если вы добавите их после объявления pri vate, то вне класса они будут невидимы. Новые действия должны помещать¬ся до строки private.