2017-03-11 4 views
0

개체를 삭제 한 후에도 개체를 계속 사용할 수 있습니다. 개체가 파괴 된 컨트롤러에 일반적인 방법이 있습니다.개체를 삭제 한 후에도 개체를 계속 사용할 수 있습니다. rails 5

def destroy 
    authorize @object, :update? 

    @attachment.destroy 
    redirect_to polymorphic_path(@object), notice: 'Attachment deleted!' 
end 

테스트 문제.

describe AttachmentsController do 
    before do 
    create_account_and_login 
    @ticket = FactoryGirl.create(:ticket, account: @account) 
    @attachment = FactoryGirl.build(:attachment, object: @ticket) 
    end 

    #-------------------------------------------------------------------------- 
    describe '#destroy' do 
    it 'destroys the attachment' do 
     VCR.use_cassette_with_file 'save sailormoon.jpg and delete and check existance' do 
     @attachment.save! 

     expect { 
      delete :destroy, params: {id: @attachment.id, ticket_id: @ticket.id} 
     }.to change { @ticket.attachments.count }.by(-1) 

     expect(S3_BUCKET.object(@attachment.key).exists?).to be_falsey 
     end 

     expect(flash[:notice]).to be_present 
     expect(response).to redirect_to(ticket_path(@ticket)) 
    end 
    end 
end 

평소와 다르지 않지만. delete :destroy, params: {id: @attachment.id, ticket_id: @ticket.id} 소위 파괴 방법. 개체가 제거되었으며 모두 정상입니다. 나는 @attachment.destroyed? 으로 확인했다. 그리고 true을 얻었다. 하지만 개체를 ​​계속 사용할 수 있습니다. @attachment.key이 키를 반환했습니다. 왜? 이 동작은 레일 4 ~ 5로 업그레이드 한 후에 나타납니다.

+2

@ attachachment 개체는 데이터베이스에서 삭제해야하지만 삭제하기 전에 작성된 메모리 내 복사본이 있으므로 계속 작업 할 수 있습니다. '@ attachment.reload'와 같은 것을하면, 발견되지 않은 예외가 발생합니다. –

답변

0

문제는 다음과 같습니다. 삭제 작업은 S3을 통해 수행되므로 컨트롤러 호출을 통해 perform_enqueued_jobs을 추가하십시오.

describe '#destroy' do 
    it 'destroys the attachment' do 
    VCR.use_cassette_with_file 'save sailormoon.jpg and delete and check existance' do 
     @attachment.save! 

     expect { 
     perform_enqueued_jobs { delete :destroy, params: {id: @attachment.id, ticket_id: @ticket.id} } 
     }.to change { @ticket.attachments.count }.by(-1) 

     expect(S3_BUCKET.object(@attachment.key).exists?).to be_falsey 
    end 

    expect(flash[:notice]).to be_present 
    expect(response).to redirect_to(ticket_path(@ticket)) 
    end 
end