我已经在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
?
答案 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