TL; DR: переменные экземпляра контроллера не являются общими для разных HTTP-запросов, поскольку каждый запрос создает новый экземпляр контроллера.
Концептуально то, что вы ожидаете, должно быть правильным!Вы определяете переменную экземпляра, и у вас должен быть доступ к ней везде по всему классу.
Проблема в том, что при каждом HTTP-запросе создается новый экземпляр класса.
Итаккогда вы нажимаете действие new
, запускается экземпляр контроллера, вызывается метод new
и создается и назначается @cart
.Что-то вроде:
# HTTP request /new
controller = MyController.new # an object of your controller is created
controller.new # the requested action is called and @cart is assigned
Но когда вы делаете новый HTTP-запрос к update
, будет инициирован новый экземпляр контроллера, будет вызван метод update
, и у него нет @cart
!
# HTTP request /update
controller1 = MyController.new # an object of your controller is created
controller1.new # the requested action is called and @cart is not assigned ?
Как видите, controller
и controller1
- это два разных объекта, инициированных из MyController
, как это происходило в двух разных HTTP-запросах (в разных контекстах).
ИсправитьВаш вопрос вам нужно создать @cart
для каждого действия, когда нужно что-то вроде:
def new
cart
end
def update
logger.debug cart.present?
end
private
def cart
@cart ||= Cart.new(session[:cart])
end