cancancan行式过滤器

时间:2017-05-12 19:25:04

标签: ruby-on-rails cancan cancancan

我已经在cancancan gem中声明了角色能力(rails 5,postgres,devise):

@try {
    [self.tableView beginUpdates];
    //try with nil to go to catch block
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
    [self.tableView endUpdates]; 
}
@catch (NSException * e) {
     [self.tableView endUpdates];
     dispatch_async(dispatch_get_main_queue(), ^{
     [self.tableView reloadData];
     });
}

can [:update, :show, :destroy, :index], SalesDatum do |datum| datum.try(:user_id) == user.id #the ids just access the id's from the user object that is passed into can can and from the table end 有一个SalesDatum字段。

这适用于show动作,因为我只能user_id已登录的SalesDatum show例如:

http://localhost:8080/projects/19/sales_data/961 正确获取身份验证,因为登录的user_id与sales_data

上的user_id匹配

http://localhost:8080/projects/19/sales_data/800 正确无法进行身份验证,因为登录的user_id与sales_data上的user_id不匹配

然而,当我进入get index动作时: http://localhost:8080/projects/19/sales_data 它显示user_id变量的所有销售数据。因此,它将显示data.id 800和961.

销售数据控制器:

@sales_data

如何让索引操作仅显示具有相关user_id的数据?是不是可以根据load_and_authorize_resource def index @sales_data = SalesDatum.where(project_id:params[:project_id]) end

过滤掉它

1 个答案:

答案 0 :(得分:1)

您需要使用哈希语法定义规则。

can [:update, :show, :destroy, :index], SalesDatum, user_id: user.id

您可能还想定义edit操作,因此:

can [:edit, :update, :show, :destroy, :index], SalesDatum, user_id: user.id

可以简化为:

can :manage, SalesDatum, user_id: user.id

如果SalesDatum定义了belongs_to :user,您也可以写:

can :manage, SalesDatum, user: user