我需要一些建议。
在我的控制器中,我有一个错误: “accessible_by调用不能与块'can'定义一起使用。无法确定SQL ...”
组控制器代码:
@groups = @q.result.order('name').accessible_by(current_ability,:read).page(params[:page]).per(20)
在ability.rb文件中:
can :read, Group do |group|
group.try(:group_type) == 1 || group.try(:user) == user || user_just_joined(user, group.id)
end
user_just_joined是一个函数,如果用户在该组中是相关的,则返回true或false。
是的,我知道我应该以这种方式准备代码,以避免此错误:
can :read, Group, :group_type => 1
can :read, Group, :user => user
can :read, Group, user_just_joined(user, :id)
//在代码上方创建“OR”语句,类似于第一个例子
但是:can :read, Group, user_just_joined(user, :id)
不起作用,:id值未定义。
使用带函数的“OR”语句的最佳解决方案是什么,返回true或false依赖于传递的params?
答案 0 :(得分:4)
从文档中,这可能会有所帮助...... accessible_by
是一个类方法,因此就像这种情况下的索引操作一样。
获取记录
块的条件只能通过Ruby执行。如果您使用accessible_by获取记录,则会引发异常。要从数据库中获取记录,您需要提供表示条件的SQL字符串。 SQL将进入WHERE子句,如果需要进行连接,请考虑使用子查询或范围(如下所示)。
can :update, Project, ["priority < ?", 3] do |project|
project.priority < 3
end
如果您正在使用load_resource并且不提供此SQL参数,则不会为索引操作设置实例变量,因为它们无法转换为数据库查询。