2013-03-19 35 views
0

对于路径标志后,您可以执行以下操作:识别用户登录后出来after_sign_out_path_for方法设计

def after_sign_in_path_for(resource) 
    if resource.class == User 
    if resource.sign_in_count < 2 
     '/dashboard' 
    else 
     '/dashboard/home' 
    end 
    elsif resource.class == AdminUser 
    I18n.locale = "en" 
    '/admin/dashboard' 
    else 
    I18n.locale = "en" 
    '/' 
    end 
end 

但是,我怎么能确认我的用户是Usersign_outAdminUser

def after_sign_out_path_for(resource_or_scope) 
    if resource_or_scope == AdminUser 

这是行不通的。有没有办法检查它?

注意:尽管我已经做了一个猴子补丁并且为admin定义了新的root,并且我的问题已经解决,但是我想知道是否有任何方法可以使用Devise的after_sign_out_path_for方法实现?

回答

1

设计为您提供current_user登录后,登录的用户。没有什么比如用户是管理员还是普通用户。

所以它不是你可以使用的。

您可以使用其他方式获得您想要的东西。

一个是Cancan,它可以与Devise很好地协作,您可以定义用户角色。

使用Cancan,您可以在用户表中定义一个列,称为角色,并为每个用户(如管理员或普通用户)定义值。那么Cancan将会有Ability.rb文件,并且你可以定义你的逻辑。

您可以使用条件 -

if user.role? :admin 
#admin related logic 
elsif user.role? :general 
#general user related logic 
end 
+0

好,谢谢......不过这是我已经知道了。设计中没有直接检查的方法吗? (虽然我知道问题是会话被破坏。) – 2013-03-19 13:40:22

1

这将在这里工作。

def after_sign_out_path_for(resource_or_scope) 
    if resource_or_scope == :user 
    redirect_to ... # users path 
    elsif resource_or_scope == :admin 
    redirect_to .... # admins path 
    end 
end 

设计会调用该方法after_sign_out_path_for与类名的符号作为参数,因此我们可以检查基于该符号的条件。

+0

好吧,让我检查。 – 2013-03-19 13:41:07

0

在用户模型中,如果您有用于指定用户角色的列,则可以执行此类操作。

def admin? 
    role == "admin" 
end 

然后你要做的就是

def after_sign_out_path_for(user) 
    if user.admin?