使用CanCan,我如何根据关联/子属性限制能力

时间:2013-01-20 17:16:36

标签: ruby-on-rails ruby-on-rails-3 postgresql cancan rails-activerecord

我有一个数据库设置,其中有许多用户,其中包含成员或管理员的角色。每个用户都有很多车。每辆车都有很多时间点

那么,只有当他是父车的所有者时,我如何限制用户编辑时间戳的能力。

CanCan:

class Ability
    include CanCan::Ability

    def initialize(user)
        user ||= User.new # guest user (not logged in)
        if user.has_role? :admin
            can :manage, :all
        elsif user.has_role? :member
            can :manage, Car, :user_id => user.id
            can :manage, Timeslip, :car => {:user_id => user.id}
        end
    end
end

所以行can :manage, Timeslip, :car => {:user_id => user.id}是我需要帮助的地方。

因为Timeslip是Car的一个关联/子项,我需要检查它的父car.user_id = Cancan user.id

我认为我写的这与CanCan文档一致,但我哪里出错?

2 个答案:

答案 0 :(得分:2)

可能有一种更短的方式来编写它,但这将起作用:

can :manage, Timeslip do |timeslip|
     timeslip.car.user_id == user.id
end

答案 1 :(得分:0)

这对我有用:can :manage, Timeslip, car: { roles: { id: user.role_ids } }