我正在使用rails 3.0.9,cancan 1.6.7并设计1.4.8
我正在使用两种设计模型(用户和管理员)进行不同的登录和注册过程
所以我想根据登录用户(资源)来划分能力,因为还有更多 两种类型的用户共有70种型号,只有10种型号(此处超过50种型号和视图仅供管理员用户使用)
我想实现两个Ability类(UserAbility和AdminAbility),并且应该将设计帮助器方法current_user / current_admin传递给UserAbility / AdminAbility
示例:
在ApplicationController.rb文件中
def current_ability
if current_user
@current_ability = UserAbility.new(current_user)
elsif current_admin
@current_ability = AdminAbility.new(current_admin)
end
end
从上面我的问题,
cancan中是否可以使用多种能力类,如果可能,那么如何创建它是因为我尝试了
rails g cancan:user_ability
但我收到错误无法找到生成器cancan:user_ability 。
如何为登录的用户/管理员选择合适的能力等级。
如果用户和管理员都访问了控制器,那么如何获取当前登录的用户/管理员对象
还有其他解决办法吗?
任何人请帮助解决这个问题
答案 0 :(得分:12)
...说,如果您愿意,可以直接使用多种能力模型:
class UserAbility
include CanCan::Ability
def initialize(user)
can :read, :all
end
end
class AdminAbility
include CanCan::Ability
def initialize(admin)
can :manage, :all
end
end
class ApplicationController < ActionController::Base
# overriding CanCan::ControllerAdditions
def current_ability
if current_account.kind_of?(AdminUser)
@current_ability ||= AdminAbility.new(current_account)
else
@current_ability ||= UserAbility.new(current_account)
end
end
end
答案 1 :(得分:7)
您不需要多个能力类:
class Ability
include CanCan::Ability
def initialize(user_or_admin)
user_or_admin ||= User.new
common_rules(user_or_admin)
if user_or_admin.kind_of? Admin
admin_rules(user_or_admin)
else
user_rules(user_or_admin)
end
end
def common_rules(user_or_admin)
# can :verb, :noun
end
def admin_rules(admin)
can :manage, :all
end
def user_rules(user)
can :read, :all
end
end
CanCan最终会使用任何一种模型调用Ability.new()
,但这非常好,因为您可以检查您收到的对象类型。当然,如果您愿意,您可以委托给其他对象;这一切都只是Ruby。
答案 2 :(得分:1)
我已经实现了@willgiynn's解决方案的一部分,在 application_controller.rb 中修改了current_ability
methot。
关于 ability.rb :
class UserAbility
include CanCan::Ability
def initialize(user)
can :read, :all
end
end
class AdminAbility
include CanCan::Ability
def initialize(admin)
can :manage, :all
end
end
在 application_controller.rb
def current_ability
@current_ability ||= current_admin ? AdminAbility.new(current_admin) : UserAbility.new(current_user)
end
希望有帮助!
答案 3 :(得分:0)
我将添加willgiynn has answered。似乎我必须添加一些代码才能使它工作。我找到了这个post
的答案将以下内容添加到 application_controller.rb
def current_ability
if admin_signed_in?
@current_ability ||= Ability.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end