用户 has_many 构造用户,后者是 has_many 的连接表:通过与 Construct 的关系。出于应用目的,布尔角色定义在连接表中(constructusers.manager、constructusers.operator 等),而 admin 是用户属性。
因此,当需要定义有关操作的策略时,以下会为“经理”引发无方法错误,而识别出关系 ActiveRecord::Relation:0x000001035c4370
def show?
user.admin? or user.constructusers.manager?
end
如果关系(我假设是正确的)是正确的,为什么没有识别布尔属性?
根据下面的评论,原因很简单,就是复数。因此过滤需要:
Constructuser.where(['construct_id = ? and user_id = ?', params[:id], current_user]).first
...它在控制器中运行并影响视图。尽管如此,对于正确的 Pundit 处理,这需要被排除在外......仍然在前过滤器中 de application_controller 以设置该属性。但是,具有该查找条件的 before_filter :set_constructuser_manager 以及 nil 案例处理在说明策略时仍然没有影响
def show?
set_constructuser_manager?
end
更新:根据下面的评论。Pundit 类私有方法
def contractorconstruct
@contructs = Construct.where(['constructusers.user_id = ?', user]).joins(:users).all
@contractorconstruct ||= Contractor.where(['construct_id IN (?)', @contructs]).first
end
和动作规则
|| contractorconstruct?
不返回任何方法错误。