2011-10-17 2 views
2

CanCan '역할'모델이있는 레일 앱이 있습니다. 역할에는 사용자의 권한 수준을 결정하기 위해 호출 할 수있는 "이름"필드가 있습니다.Factory_Girl & CanCan : 고유성 오류 방지

팩토리 걸에는 '역할'필드와 관련된 모델이 많이 있습니다. 깊은 반복이 많이 있습니다. 예 : ('account'공장은 '역할'과 연관이있는 '사용자'공장과 연관이있는 '구매'공장과 연관되어 있습니다.)

문제는 두 가지를 호출하면 팩토리가 '역할'과 연결되면 결국 두 번째 호출은 해당 역할 -> '이름'필드에서 고유성 검증을 실패합니다. 일반적으로 고유성 확인은 문제가 아닙니다. 문제가되는 속성을 시퀀스에 설정했는데 여기서는 할 수 없습니다. 역할의 이름은 cancan 기능을 위해 고유해야합니다.

그래서 ... 어떻게이 문제를 해결할 수 있습니까?

답변

1

모든 역할을 앞쪽으로 만든 다음 필요에 따라 테스트에서 찾을 수 있습니까?

그렇지 않은 경우 특정 테스트에서 필요한 역할을 생성 한 다음 팩토리에 전달할 수 있습니까?

admin_role = Factory.create(:role, :role_name => "administrator") 
Factory.create(:user, :login => "joe", :role => admin_role) 
Factory.create(:user, :login => "jane", :role => admin_role) 
+0

환호성에 대한 환호. 잠재적으로 그렇습니다. 그러나 많은 공장들이 깊이 중첩되어 있습니다. 따라서 예를 들어 '등록'팩토리를 만들고 싶다면 역할 팩토리를 만든 다음 역할 세트가있는 사용자 팩토리를 만든 다음 사용자 세트가있는 구매 팩토리를 만든 다음 해당 구매로 등록해야합니다 세트. – PlankTon

+0

흠, 역할 목록이 있다면 역할이 만들어지면 목록에서 '.pop'가 나옵니까? 또는, 팩토리 (factory)가 필요하지 않을 때 중복을 막기 위해 관련 역할을 리턴하는'Factory.rb'에 메소드 (factory가 아닌)를 작성한다면 어떻게 될까요? – jefflunt

+0

여기에 언급 된 것과 같은 솔루션 (http://stackoverflow.com/a/7213281/241232)이 필요에 맞을 가능성이 큽니다. 유일한 문제는 역할을 필요로하는 새 팩토리를 정의 할 때 해당 메소드를 사용하는 것을 기억하는 것은 개발자에게 달려 있다는 것입니다. – BBonifield