2012-01-12 53 views
0

我正在使用Devise处理购物应用程序中的用户。我想要做的是每次用户登录时创建一个新的购物车(理想情况下,每次用户注销时都销毁同一个购物车,但我会坚持这个问题的第一部分)。如何让应用程序控制器知道用户已登录(用户使用设计进行处理)

到目前为止,我看这个问题:Devise call backs

我想出了这一点:

class ApplicationController < ActionController::Base 
    helper :all 
    protect_from_forgery 

    before_filter :fetch_categories 

    . 
    . 
    . 

    Warden::Manager.after_authentication do 
    session[:cart_id] ||= Cart.create!.id 
    end 
end 

......但显然这是不正确的,因为我得到这个错误:

NameError in Devise::SessionsController#create 

undefined local variable or method `session' for ApplicationController:Class 

有一些其他的方式,我可以告诉应用程序控制器来响应用户登录,或者我应该在其他地方把这个代码(除应用控制器)?谢谢你的帮助。

回答

2

the docs扫视了一眼,它看起来像你可以做这样的事情:

Warden::Manager.after_authentication do |user, auth, opts| 
    auth.session[:cart_id] ||= Cart.create!.id 
end 
+0

这似乎已经奏效整个应用

检查!在我将其标记为答案之前,有一件事情:你有什么想法,为什么你必须调用auth.session而不是仅仅是会话? – varatis 2012-01-12 09:15:54

+0

因为'ApplicationController'没有名为'session'的类方法。 'session'是一个实例方法(并且在你的代码中你在类上下文中调用它)。我的代码的工作原理是因为'after_authentication'将身份验证代理对象作为第二个参数(我称之为'auth')传递给该块,并且该对象具有'session'方法,该方法返回经过身份验证的用户的会话数据。 – 2012-01-12 09:18:42

-1

Simpally写一个过滤器之前

application controller

before_filter :set_current_user

def set_current_user Authorization.current_user = current_user end

您可以使用

` if !current_user.nil? 

    end` 
相关问题