如何在Devise.sessions#destroy中将信息保存到模型中?

时间:2013-04-25 13:09:04

标签: ruby-on-rails devise piggybak

我正在使用Devise和Piggybak作为Rails project,而Piggybak使用名为 cart 的cookie来存储用户购物车。问题是Piggybak没有破坏用户sign_out上的cookie,因此,如果我与另一个用户签名,它使用相同的cookie,因此使用相同的购物车。

我想解决将cookie值存储到我的用户模型中的问题,使其能够在另一个sign_in上取回他的购物车。我所做的是重写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 个答案:

答案 0 :(得分:0)

做到了,谢谢你@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

并相应地改变了我的会话#destroy:

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