2012-02-09 5 views
2

私はいくつかのアドバイスが必要です。私のコントローラでCanCanとaccessible_byによってエラーが発生しました.SQLを特定できません。

、私はエラーを持っている: 「accessible_by呼び出しはブロックで使用することはできません定義 『に』 SQLは...決定することはできません。」

グループコントローラのコードは:

@groups = @q.result.order('name').accessible_by(current_ability,:read).page(params[:page]).per(20) 
ability.rbファイルで

:ユーザーはこのグループに関連する、またはされていない場合user_just_joined

can :read, Group do |group| 
     group.try(:group_type) == 1 || group.try(:user) == user || user_just_joined(user, group.id) 
end 

は、trueまたはfalseを返す関数です。

はい、私はこのエラーを回避するために、このようにコードを準備する必要があることを知っている:

can :read, Group, :group_type => 1 
can :read, Group, :user => user 
can :read, Group, user_just_joined(user, :id) 

//コード上の文を作成し、「OR」shoult、

最初の例に類推しかし: can :read, Group, user_just_joined(user, :id)は動作しません:id値は未定義です。

渡されたパラメータに依存して、関数に "OR"ステートメントを使用すると、真または偽を返す最適な解決策は何ですか?

答えて

3

ドキュメントからは、これが役立つかもしれません... accessible_byはクラスメソッドなので、この場合はインデックスアクションのようです。

フェッチレコードが

ブロックの条件は、Rubyによってのみ実行可能です。 accessible_byを使用してレコードを取得している場合、例外が発生します。データベースからレコードをフェッチするには、条件を表すSQL文字列を指定する必要があります。サブクエリやスコープ(下記参照)を使用して結合を行う必要がある場合は、SQLはWHERE句に入ります。

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

あなたがload_resourceを使用していて、このSQLの引数を指定しない場合は、データベースクエリに変換することができないため、インスタンス変数は、indexアクションのために設定されることはありません。

+0

括弧内のクエリーが存在する必要がありますか? – quantumpotato

関連する問題