私は cancan gem を使用しており、ability.rb で、特定の役割を持つユーザーが別のオブジェクトを更新できるかどうかを確認したかったのは、そのユーザーが他のオブジェクトの「一部」である場合 (つまり、モデル間の関連付け、およびユーザーはオブジェクトのusers
メソッドで検出されます)。
include?
メソッドを使用@current_user
して、結果のUser
配列に が含まれているかどうかを確認したかったのです。
false
これは、ability.rb を介してコードをテストするときに常に返されます。Rails コンソールで同じコードを実行すると、問題なく動作します。
オブジェクトが渡されたオブジェクトと同じクラスではないinclude?
場合、それは機能しないことがわかりましたが、クラスを介して出力しましたが、それらは同じです。Array
class.name
私はdetect
IDを使用して比較することになりましたが、以前にこの種の問題が発生したことがあるかどうか、またこれに光を当てることができるかどうかを知りたいと思いました.
delete_if
100 のうち 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