已有用户模型的程序集成 devise如果你的 rails 程序已经创建了用户模型,又不想重新创建,devise 可以帮你重写模型,你在用 devise 的生成器创建用户模型的时候,只要指定你的用户模型的名字即可。假设 rails 程序已经创建了用户模型 Buser。
$ rails generate devise Buser
$ rails generate rolify Role Buser
由于自己创建的用户模型名字不是 User ,所以会导致登录后 current_user 不存在。这个问题其实是因为名字引起的,登录后获取当前用户应该是 current_<用户模型名>,以 buser 举例,现在登录后的当前用户就是 current_buser。
CanCan 对你的应用程序做出两个假设:一个是假设你有一个类定义权限的能力,另一个是假设你有一个 current_user 方法的控制器返回当前用户模型。你可以覆盖这两个定义 current_ability 的方法。现在我们的当前用户是用 current_buse 获取,所以我们也必须重写 cancan 的默认方法。
重写的方法放在 ApplicationController.rb 中。
清单11. 重写 cancan 默认方法def current_ability
@current_ability ||= Ability.new(current_buser)
end
The Ability class and current_user method can easily be changed to something else.
# in ApplicationController
def current_ability
@current_ability ||= AccountAbility.new(current_account)
end
利用 rolify 为用户添加角色在创建用户之后,如果没有为用户创建角色,我们需要为用户分配一个默认角色。这个方法可以声明为 user 模型的 after_create。
清单11. 为用户添加默认角色1
| class User < ApplicationRecord
|
after_create :assign_default_role
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and mniauthable
devise :database_authenticatable, :registerable,
1
| :recoverable, :rememberable, :trackable, :validatable
|
def assign_default_role
self.add_role(:author) if self.roles.blank?
end
end
然后在管理用户的时候,我们就可以调用一下方法来为用户分配角色。
注意后面的 :admin 就是角色名称,但是要用符号 (Symbol) 类型,不可以用字符串。
@user.add_role :admin
@ user.remove_role :admin
user.has_role? :admin |