2013-10-07 5 views
0

나는 cancan gem을 사용하고 있으며 ability.rb에서 특정 역할을 가진 사용자가 다른 객체를 업데이트 할 수 있는지 확인하기를 원했습니다. 모델 사이에 연관이 있으며 사용자는 객체의 users 메소드에 있습니다.루비 배열에는? 메서드 이상한 동작

User 배열에 @current_user이 있는지 확인하려면 include? 메서드를 사용하고 싶습니다.

ability.rb를 통해 코드를 테스트 할 때 항상 false을 반환합니다. 레일즈 콘솔에서 같은 코드를 실행하면 잘 동작합니다.

Array 개체가 전달 된 개체와 동일한 클래스가 아닌데도 class.name을 통해 해당 클래스를 인쇄하고 동일한 경우 include?이 작동하지 않는 것으로 나타났습니다.

나는 detect을 사용하여 이드를 비교했지만 이전에 이런 종류의 문제가 있었는지, 그리고 이것에 대해 밝혀 낼 수 있는지 알고 싶었습니다.

비슷한 결과가 delete_if인데, 100에서 20을 삭제 한 후에도 여전히 100을 반환했지만 각 루프는 거기에있는 것으로 가정 한 것만 인쇄했습니다 (20). 이것은 RoR 환경 내에서 실행될 때 발생했지만 동일한 코드를 가진 레일 콘솔이 예상대로 작동합니다 (array.count # => 20).

EDIT 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입니다. 의 == 운영자가이 특정 모델에 대해 어떤 식 으로든 이상한 경우

그래서 심지어 도, 나는 두 경우 모두 동일한 배열을 처리하고있어, 그래서해야 하나 가슴이나 모두가지 경우에서 잘 작동 cancan 내에서만이 아니라 ability.rb ... 맞습니까?

+4

당신은 코드 또는 생식 케이스를 추가 할 수 있습니다 : 당신이 당신의 Ability 클래스에서이를 설정할 수 방법 정확한 설정을 모른 채,이에 가까워 야? – Davidann

+0

코드 예제없이 말하기는 어렵지만 사과와 오렌지를 비교할 수 있습니다. 그냥 객체의 평등 연산자'=='를 검사하여'Array # include? '및 다른 메소드의 예상되는 동작을 보장하십시오. –

답변

1

Cancan에는 연결을 쿼리하는 기본 제공 메커니즘이 있습니다.

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