【问题标题】:CanCan and accessible_by give an error, that The SQL cannot be determinedCanCan 和accessible_by 给出错误,无法确定SQL
【发布时间】:2012-02-09 10:48:03
【问题描述】:

我需要一些建议。

在我的控制器中,我有一个错误: "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 是一个函数,它返回真或假,如果用户在这个组中相关,或者不相关。

是的,我知道我应该以这种方式准备代码,以避免出现此错误:

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”语句的最佳解决方案是什么,根据传递的参数返回真或假?

【问题讨论】:

    标签: ruby-on-rails-3.1 cancan


    【解决方案1】:

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

    获取记录

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

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

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

    【讨论】:

    • 你是说括号之间的查询一定存在?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2013-12-04
    • 2015-12-10
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多