我有一个资源数据库,其中资源可以属于不同的位置。用户和组(自引用用户表)可以在不同位置具有不同的角色。组可以在其他组内。授权适用于使用“if_attribute”检查 location_id 是否在允许用户显示、编辑等的 location_id 中的单个用户:
has_permission_on :locations do
to [:show, :new, :create, :edit, :update, :destroy]
if_attribute :id => is_in { (user.permissions.where(:role => "admin").collect {|i| Location.find_by_id(i.location_id).subtree_ids}.flatten.uniq )}
end
由于这些组可以相互“嵌套”,我认为我必须使用递归方法来查找所有“合法”位置 ID。我试过这个:
has_permission_on :locations do
to [:show, :new, :create, :edit, :update, :destroy]
if_attribute :id => is_in { (user.permissions.where(:role => "admin").collect {|i| Location.find_by_id(i.location_id).subtree_ids} + find_group_location_ids(user)).flatten.uniq }
end
使用在“授权执行”例程之外定义的方法:
def find_group_location_ids(user)
location_ids = []
nested_group_location_ids(user)
def nested_group_location_ids(user)
user.group_memberships.each do |gm|
location_ids = location_ids + gm.user.location.id
nested_group_location_ids(gm.user)
end
end
return location_ids
end
问题是方法调用没有找到方法。我收到此错误:
NoMethodError(未定义的方法 `find_group_location_ids' for (Authorization::Engine::AttributeValidator:0x7fb63448e2b0)
我试图将方法定义放在很多不同的地方,但没有运气。
如何使用 if_attribute 来查看 id 是否在递归方法的数组中?