Rails: 使模型仅由 CanCanCan 读取和编辑自己的数据

Rails: Make model to read and edit only own data by CanCanCan

我有 AdminPartner 型号。 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 的访问,结合 DeviseCanCanCan

我想我会为每个控制器添加类似这样的东西:

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,但我只有 AdminPartner 模型具有 Devise 授权,并且有很多模型控制器可以不需要任何授权甚至不需要模型。

嗯,我不知道如何在所有模型上执行此操作,但您可以像这样在每个模型上制定规则

when Partner
  can :manage, Service, user_id: user.id

这将只允许合作伙伴管理服务where(user_id: current_user.id)