0

对于登录后路径,您可以执行以下操作:

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

但是,如何检查我的用户是 aUser还是AdminUserafter sign_out

def after_sign_out_path_for(resource_or_scope)
  if resource_or_scope == AdminUser

这不起作用。有什么方法可以检查吗?

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

4

3 回答 3

1

Devise 会current_user在您登录后为您提供登录用户。用户是管理员还是普通用户,没有什么比这更重要的了。

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

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

一个是与 Devise 配合得很好的 Cancan,您可以定义用户角色。

使用 Cancan,您可以在用户表中定义一个列,例如角色,其中包含每个用户(如管理员或普通用户)的值。那么就会有Ability.rbCancan 的文件,你可以在那里定义你的逻辑。

您可以使用条件 -

if user.role? :admin
 #admin related logic
elsif user.role? :general
 #general user related logic
end
于 2013-03-19T13:33:47.680 回答
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

Devise 将调用after_sign_out_path_for方法,并以类名的符号作为参数,因此我们可以根据该符号检查条件。

于 2013-03-19T13:40:16.960 回答
0

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

def admin?
  role == "admin"
end

那么你要做的就是

def after_sign_out_path_for(user)
  if user.admin?
于 2013-09-13T08:26:21.137 回答