2011-10-17 3 views
2

私はCanCan 'ロール'モデルを持つレールアプリを持っています。役割には「名前」フィールドがあり、ユーザーの権限レベルを判断するために呼び出すことができます。Factory_Girl&CanCan:一意性エラーを避ける

ファクトリーガールでは、「ロール」フィールドに関連するモデルがたくさんあります。深いいくつかの反復。例:( 'account'ファクトリは 'user'ファクトリと関連している 'purchase'ファクトリと関連していますが、 'role'との関連があります)

問題は、 'ロール'に関連付けられたファクトリは、呼び出される2番目のロールは、そのロール - > '名前'フィールドでの一意性検証に失敗します。通常、一意性の検証は問題ではありません。問題のある属性をシーケンスに設定しただけですが、ここではできません。役割の名前は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

Hm、ロールのリストがあれば、ロールが作成されるとリストから '.pop'するとどうなるでしょうか?あるいは、重複を避けるために(工場で)必要なときに関連する役割を返す 'Factories.rb'にメソッド(ファクトリーではありません)を書くだけならどうでしょうか? – jefflunt

+0

ここに記載されているような解決策(http://stackoverflow.com/a/7213281/241232)は、おそらくニーズに合っています。唯一の問題は、ロールを必要とする新しいファクトリを定義するときに、そのメソッドを使用することを開発者が覚えておくことです。 – BBonifield