Ruby on rails 3.1 CanCan和accessible_会给出一个错误,即无法确定SQL

Ruby on rails 3.1 CanCan和accessible_会给出一个错误,即无法确定SQL,ruby-on-rails-3.1,cancan,Ruby On Rails 3.1,Cancan,我需要一些建议 在我的控制器中,我有一个错误: “通过调用访问的\u不能与块“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 ||

我需要一些建议

在我的控制器中,我有一个错误: “通过调用访问的\u不能与块“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)
//上面的代码应该创建“或”语句,类似于第一个示例

但是:
can:read、Group、user\u刚刚加入(user,:id)
不起作用,:id值未定义


使用带函数的“OR”语句返回true或false(取决于传递的参数)的最佳解决方案是什么?

从文档中可以看出,这可能有助于。。。可由访问的
是一个类方法,因此与本例中的索引操作类似

获取记录

块的条件只能通过Ruby执行。如果您使用可访问的\u获取记录,它将引发异常。要从数据库中获取记录,需要提供一个表示条件的SQL字符串。SQL将进入WHERE子句中,如果需要连接,请考虑使用子查询或作用域(以下)。
can:update,Project,[“priority<?”,3]do | Project|
项目优先级<3
结束

如果您正在使用load_resource,并且没有提供此SQL参数,则不会为索引操作设置实例变量,因为它们无法转换为数据库查询。

您是说括号之间的查询必须存在吗?
can :update, Project, ["priority < ?", 3] do |project|
  project.priority < 3
end