2013-10-07 28 views
0

我正在使用cancan gem,而在ability.rb中,我想檢查具有特定角色的用戶是否可以更新另一個對象,當且僅當用戶'是另一個對象的一部分時是,模型之間有關聯,用戶可以在對象的users方法中找到)。Ruby數組包括?方法奇怪的行爲

我想使用include?方法來查看在所得到的User陣列中是否找到@current_user

當通過ability.rb測試代碼時,它總是返回false。如果我在rails控制檯中運行相同的代碼,它工作正常。

我發現include?不起作用,如果Array對象不是傳遞對象相同的類,但我通過class.name打印他們的類,他們是相同的。

我最終使用detect並比較了id,但我想知道是否有人曾經遇到過這類問題,以及是否可以對此進行說明。

delete_if發生了類似的情況,在從100中刪除20之後,count仍然返回100,但每個循環僅打印應該在那裏的那些(20)。在RoR環境中執行時會發生這種情況,但具有相同代碼的Rails控制檯的行爲與預期相同(array.count # => 20)。

編輯20131007

的代碼關於include?問題有點。 即使用戶在從course.institution.users產生的數組中,該位始終返回false。

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

如果我採取同樣的路線,並嘗試在軌道控制檯給定的過程和用戶​​,像這樣:

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

它可以作爲它應該,返回true那麼用戶在數組中找到並且如果不是,則返回false

因此,即使,即使如果==經營者以某種方式怪異這個特定的模式,我處理在兩種情況下相同的陣列,所以它要麼破產或兩種箱子做工精良,不僅在康康ability.rb ......對吧?

+4

你可以添加一個代碼片段或repro情況? – Davidann

+0

很難說沒有代碼的例子,但會打賭你比較蘋果與橙子。只需檢查對象的相等運算符'=='以確保'Array#include?'和其他方法的預期行爲。 –

回答

1

康康有一個內置的查詢關聯機制。不知道你的確切設置,這應該接近你如何設置你的Ability類:

can :view, MyObject, users: { id: user.id }