Rails: 使模型仅由 CanCanCan 读取和编辑自己的数据
Rails: Make model to read and edit only own data by CanCanCan
我有 Admin
和 Partner
型号。 Partner
has_many Services
。我正在使用 Devise 和 CanCanCan。我在 application_controller
:
中设置了默认值
# This is for changing defaults for CanCanCan
def current_ability
if admin_signed_in?
@current_ability ||= Ability.new(current_admin)
elsif partner_signed_in?
@current_ability ||= Ability.new(current_partner)
end
end
现在我的 Abilities
class:
case model
# if model is Admin
when Admin
can :manage, :all
# if model is Partner
when Partner
can :read, Partner, id: model.id
can :manage, Service, partner_id: model.id, partner: {active: true}
can :create, Service
can :update, Partner, id: model.id, active: true
else
cannot :read, :all
end
model
是我创建的一个参数,而不是旧的 user
。我在视图中放置了很多 if can?
条件。
问题来了:根据谁登录,我如何限制对 pages and controllers
的访问,结合 Devise
和 CanCanCan
?
我想我会为每个控制器添加类似这样的东西:
before_action :check_logged_in
def check_logged_in
if partner_signed_in?
# do something
elsif admin_signed_in?
# do something
end
end
但这会使 CanCanCan
变得无用,如果我有太多控制器,将很难维护。
我想我应该为我的控制器使用 load_and_authorize_resource
,但我只有 Admin
和 Partner
模型具有 Devise 授权,并且有很多模型控制器可以不需要任何授权甚至不需要模型。
嗯,我不知道如何在所有模型上执行此操作,但您可以像这样在每个模型上制定规则
when Partner
can :manage, Service, user_id: user.id
这将只允许合作伙伴管理服务where(user_id: current_user.id)
我有 Admin
和 Partner
型号。 Partner
has_many Services
。我正在使用 Devise 和 CanCanCan。我在 application_controller
:
# This is for changing defaults for CanCanCan
def current_ability
if admin_signed_in?
@current_ability ||= Ability.new(current_admin)
elsif partner_signed_in?
@current_ability ||= Ability.new(current_partner)
end
end
现在我的 Abilities
class:
case model
# if model is Admin
when Admin
can :manage, :all
# if model is Partner
when Partner
can :read, Partner, id: model.id
can :manage, Service, partner_id: model.id, partner: {active: true}
can :create, Service
can :update, Partner, id: model.id, active: true
else
cannot :read, :all
end
model
是我创建的一个参数,而不是旧的 user
。我在视图中放置了很多 if can?
条件。
问题来了:根据谁登录,我如何限制对 pages and controllers
的访问,结合 Devise
和 CanCanCan
?
我想我会为每个控制器添加类似这样的东西:
before_action :check_logged_in
def check_logged_in
if partner_signed_in?
# do something
elsif admin_signed_in?
# do something
end
end
但这会使 CanCanCan
变得无用,如果我有太多控制器,将很难维护。
我想我应该为我的控制器使用 load_and_authorize_resource
,但我只有 Admin
和 Partner
模型具有 Devise 授权,并且有很多模型控制器可以不需要任何授权甚至不需要模型。
嗯,我不知道如何在所有模型上执行此操作,但您可以像这样在每个模型上制定规则
when Partner
can :manage, Service, user_id: user.id
这将只允许合作伙伴管理服务where(user_id: current_user.id)