2014-11-19 1 views
1

Help! 내가 수정에 있어요 .. 그것을 확인 :연결 콜백 후

FactoryGirl.define do 
    factory :card do 
    number "1234123412341234" 
    exp_month 12 
    exp_year 2016 

    association :user 

    before(:create) do |instance| 
     # Start a crypto instance with this users public key and encrypt 
     crypt = Modules::Crypto.new(instance.user.encryption_key_id) 
     instance.number = crypt.encrypt("1234123412341234") 
    end 

    trait :unencrypted do 
     number "1234123412341234" 
    end 
    end 
end 

을 내가 알아 내기 위해 노력하고있어 방법 :

  1. 트리거 상기 :user가 생성 된 후 콜백하지만 :card는 생성 된 (또는 카드가 암호화되지 않기 때문에 모델 검증이 실패합니다)

  2. :unencrypted 특성 재정의 일을 확인 전자 콜백.

+1

당신은'instance.card = crypt.encrypt ("1234123412341234")'에 대한 오타가 있습니까, 나는'instance.number = crypt.encrypt ("1234123412341234")' –

+0

이되어야한다고 생각합니다. 'instance.user = FactoryGirl.create (: user)'를 사용하여 이전 (: create)에서 자신을? –

+0

@ 토니 당신 말이 맞아요. 그것은'instance.number'입니다. – FloatingRock

답변

1

answer에서 언급 된 트릭이 issue은 검증없이 저장하기 위해 작성 방법을 변경하는 것입니다. 그런 다음 값을 암호화하는 after(:create)을 추가 할 수 있습니다.

FactoryGirl.define do 
    factory :card do 
    to_create {|instance| instance.save(validate: false) } 
    number "1234123412341234" 
    exp_month 12 
    exp_year 2016 
    user 

    after(:create) do |instance| 
     # Start a crypto instance with this users public key and encrypt 
     crypt = Modules::Crypto.new(instance.user.encryption_key_id) 
     instance.number = crypt.encrypt("1234123412341234") 
    end 

    trait :unencrypted do 
     number "1234123412341234" 

     after(:create) do |instance| 
     # This is a noop to override previous after(:create) 
     end 
    end 
    end 
end 

"공장 이름이 연결 이름과 같으면 공장 이름을 생략 할 수 있습니다."