使用CanCan和Ruby on Rails定义具有块动作索引的能力

时间:2011-06-05 02:59:40

标签: ruby-on-rails filter indexing block cancan

我需要在用户上添加过滤器。仅当用户属于同一分支时,用户才能看到其他用户。一个用户可以属于多个分支。

我正在使用下面的块定义能力。但在提到文档并面对错误之后,我知道index方法不适合用块定义能力。

#This code is part of initialisation method of ability.rb

can :index, User do |curr_user|
    #check if user belongs to same branch
    !curr_user.branch_ids.index(branch_id).nil?
end

这是用户控制器的索引方法

def index
    authorize! :index, User

    @users = User.where(params[:user]).accessible_by(current_ability, :index)

    renders :obj =>@users
end

用什么替代方法来定义实现此逻辑的能力来代替用块定义能力?

1 个答案:

答案 0 :(得分:1)

accessible_by就像AR的where一样......

您应该使用条件哈希而不是块来定义您的能力 见Defining-Abilities

像...一样的东西。

def initialize(user)
 conditions = branch_id: user.branch_id
 can :read, User, conditions
end

我建议你先在irb console

中加注正确conditions
user = User.first
User.where(branch_id: user.branch_id)

然后你可能想要一个测试