0

私は cancan gem を使用しており、ability.rb で、特定の役割を持つユーザーが別のオブジェクトを更新できるかどうかを確認したかったのは、そのユーザーが他のオブジェクトの「一部」である場合 (つまり、モデル間の関連付け、およびユーザーはオブジェクトのusersメソッドで検出されます)。

include?メソッドを使用@current_userして、結果のUser配列に が含まれているかどうかを確認したかったのです。

falseこれは、ability.rb を介してコードをテストするときに常に返されます。Rails コンソールで同じコードを実行すると、問題なく動作します。

オブジェクトが渡されたオブジェクトと同じクラスではないinclude?場合、それは機能しないことがわかりましたが、クラスを介して出力しましたが、それらは同じです。Arrayclass.name

私はdetectIDを使用して比較することになりましたが、以前にこの種の問題が発生したことがあるかどうか、またこれに光を当てることができるかどうかを知りたいと思いました.

delete_if100 のうち 20 を削除した後、count はまだ 100 を返していましたが、各ループはそこにあるはずのもの (20) だけを出力しました。これは RoR 環境内で実行したときに発生しましたが、同じコードの Rails コンソールは期待どおりに動作しました ( array.count # => 20)。

編集 20131007

問題に関する少しのコードinclude?。このビットは、ユーザーが からの結果の配列にある場合でも、常に false を返しますcourse.institution.users

    can [:read, :update], Course do |course|
      val = course.institution.users.include? user
    end

同じ行を取り、Rails コンソールで特定のコースとユーザーに対して試してみると、次のようになります。

    Course.find(course_id).institution.users.include? User.find(user_id)

想定どおりに機能しtrue、ユーザーが配列で見つかった場合は返され、falseそうでない場合は返されます。

したがって、この特定のモデルで演算子が何らかの形で奇妙だったとしても、両方のケースで同じ配列を扱っているので、カンカン内だけでなく、両方の==ケースでバストまたはうまく機能するはずです...正しい?ability.rb

4

1 に答える 1

1

Cancan には、関連付けを照会するためのメカニズムが組み込まれています。Ability正確なセットアップを知らなくても、これはクラスでこれをセットアップする方法に近いはずです。

can :view, MyObject, users: { id: user.id }
于 2013-10-07T21:54:27.127 に答える