我正在使用Cancan,Devise,Rails 3进行订购。
每个用户通过协议拥有许多公司。每家公司还通过协议拥有许多用户。
在我的能力模型中,我有以下内容:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user
if user.role? :super
can :manage, :all
elsif user.role? :admin
can :manage, [User, Company, Order]
elsif user.role? :tech
can :manage, [User, Company, Tech]
elsif user.role? :customer_admin
can [:read, :update], User, :id => user.id
can [:read, :update], Company, :id => user.id
can [:read ], Order, :id => user.id
end
end
end
当customer_admin登录时,我一直在尝试向他们展示他们所关联的公司。在公司视图中,我可以很好地看到用户列表。
在我的公司控制器(索引)中,我尝试过这样做:
@usercompanies = Company.where(['user_id = ?', current_user.id ])
然而,这列出了错误的公司?!
我确定这是一个愚蠢的新手错误,但感谢你的帮助。如果您还有其他需要,请告诉我。
答案 0 :(得分:1)
你可以很快地添加cancan的限制,这也是我第一次设置它时的困惑。设置此文档的文档是here。作为参考,您希望在控制器中使索引操作看起来像这样:
@usercompanies = Company.accessible_by(current_ability)
然而,在最新版本的gem中,这应该在索引操作上自动完成。我认为你的abilities.rb
中有一个错误,因为当你有一个记录并且你与一个用户相关时,它通常有一个名为user_id的列。您可能希望像这样使用它:
can [:read ], Order, :user_id => user.id
由于属性id
通常用作记录的唯一ID,而不是association的ID。