2013-04-25 20 views
1

我使用Devise和Piggybak作为Rails project,Piggybak使用名为的购物车来存储用户购物车。问题是Piggybak不会销毁用户sign_out上的cookie,因此,如果我与另一个用户签约,它会使用相同的cookie,因此也是同一个购物车。如何将信息保存到Devise.sessions上的模型#destroy?

我想解决的是将该cookie值存储到我的用户模型中,使其能够在另一个sign_in上取回他的购物车。我所做的就是重写#销毁方法Devise.sessions,以节省用户的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

你必须保存用户实例(在'add_cart_cookie'方法 – 2013-04-25 15:35:16

+0

我是否使用'self.save!'?如何在保存之前传递密码和password_confirmation进行身份验证? – 2013-04-25 16:53:26

回答

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 

而且改变了我的会话#据此破坏:

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 
相关问题