Как сохранить информацию в модели на Devise.sessions#destroy?

Я использую Devise и Piggybak для проекта Rails, а Piggybak использует cookie с именем cart для хранения пользовательской корзины. Проблема в том, что Piggybak не уничтожает cookie для пользователя sign_out, поэтому, если я регистрируюсь с другим пользователем, он использует тот же cookie и, следовательно, ту же корзину.

Я хочу разрешить сохранение этого значения cookie в моей пользовательской модели, чтобы оно могло вернуть свою корзину в другой вход. Я переопределил метод Devise.sessions # destroy, чтобы сохранить значение cookie для пользователя и уничтожить cookie:

# app/controllers/users/sessions_controller.rb

class Users::SessionsController < Devise::SessionsController

  def destroy
    current_user.add_cart_cookie(cookies['cart']['value'])
    cookies['cart'] = { value: '', path: '/' }
    super
  end
end

Маршрутизация прямо на маршрутах:

# config/routes.rb

...

devise_for :users, controllers: { sessions: 'users/sessions' }

...

И создание метода add_cart_cookie к моей модели пользователя:

# app/models/user.rb

class User < ActiveRecord::Base

...

  def add_cart_cookie(value)
    self.cart_cookie = value
  end

...

end

Но это не работает, оно уничтожает cookie, но не сохраняет его в пользовательской модели. Почему это происходит?

1 ответ

Решение

Сделал это, спасибо @Marian.

Что я сделал, так это поменял add_cookie_cart способ принять другой параметр:

# app/models/user.rb

class User < ActiveRecord::Base

...

  def add_cart_cookie(value, password)
    self.cart_cookie = value
    self.password = password
    self.password_confirmation = password
    self.save
  end

...

end

И изменил мой сеанс # уничтожить соответственно:

class Users::SessionsController < Devise::SessionsController

  def destroy
    current_user.add_cart_cookie(cookies['cart']['value'], current_user.password)
    cookies['cart'] = { value: '', path: '/' }
    super
  end
end
Другие вопросы по тегам