CanCan和accessible_by给出错误,无法确定SQL

时间:2012-02-09 10:48:03

标签: ruby-on-rails-3.1 cancan

我需要一些建议。

在我的控制器中,我有一个错误: “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?

1 个答案:

答案 0 :(得分:4)

从文档中,这可能会有所帮助...... accessible_by是一个类方法,因此就像这种情况下的索引操作一样。

获取记录

块的条件只能通过Ruby执行。如果您使用accessible_by获取记录,则会引发异常。要从数据库中获取记录,您需要提供表示条件的SQL字符串。 SQL将进入WHERE子句,如果需要进行连接,请考虑使用子查询或范围(如下所示)。

can :update, Project, ["priority < ?", 3] do |project|
  project.priority < 3
end

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