2011-10-19 3 views
1

종이 클립을 사용하여 광산 모델에 파일을 첨부하고 있습니다. 제가하고 싶은 것은 모델이 저장되고 디스크에 파일이 작성된 후에 파일에 대한 모델의 다른 속성 (CRC)을 업데이트해야한다는 것입니다. paperclip은 .save가 호출 될 때까지 디스크에 파일을 쓰지 않기 때문에, 처음 생각한 것은 after_save 콜백을 사용하는 것이 었습니다. 이렇게하면 "SystemStackError (스택 수준이 너무 높음) :"오류가 발생합니다. 그런 다음 조금 더 나은 것으로 보이는 after_commit 콜백을 시도했습니다. 예를 들어, 단순히 내 crc를 할당하면 :저장 후 레코드를 업데이트 할 시점은 언제입니까?

self.crc = "TEST" 
self.save 

이것은 작동합니다. 그러나, 나는이와, 내 진짜 임무를 수행하려고 할 경우

self.crc = "0x" + IO.read(self.patchfile.path, 4, 0x20).unpack("H8").join 
self.save 

에 WEBrick과 함께 중단 : 그래서

/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x180048) [0x290048] 
/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_yield+0x56) [0x294c46] 

[NOTE] 
You may have encountered a bug in the Ruby interpreter or extension libraries. 
Bug reports are welcome. 
For details: http://www.ruby-lang.org/bugreport.html 

Aborted 

내가이 잘못을하고있는 중이 야 생각하고 ...

+0

나는 그것이 WEBrick을 죽이는 동안 실제로 작동한다는 것을 언급해야한다. 다시 시작하면 CRC 특성이 올바르게 설정됩니다. 또한 위에 나열된 오류에는 더 많은 것이 있으며 꼬리표를 게시했습니다. –

답변

5

당신에게 ' 다시 after_save 콜백 내부로 들어가면 save으로 전화를 걸 수 있습니다. 다시 콜백을 트리거 할 것입니다. 무한 루프의 "stack level too deep"오류가 발생합니다.

콜백에서 대기중인 DelayedJob을 사용하는 것이 좋습니다. 백그라운드 작업이 CRC 할당 작업을 처리하게하십시오. 그러나 무한 루프가 계속 발생하지만 이번에는 대기중인 작업이 무한 루프됩니다.

특정 조건에서 콜백을 건너 뛰는 방법은 How can I avoid running ActiveRecord callbacks?을 참조하십시오.

편집 :

당신은 또한 자신의 종이 클립 포스트 프로세서를 작성 할 수 있습니다. Readme에서 "Post Processing"및 "Custom Attachment Processor"섹션을 살펴보고 코드를 파헤 치면 기존 프로세서의 작동 방식을 확인할 수 있습니다.

https://github.com/thoughtbot/paperclip

+0

좋아요, 제가 살펴 보겠습니다. 또 다른 질문은 디스크에 저장되기 전에 파일 내용에 액세스하는 방법이 있습니까? 이 경우, 나는 이것을 할 필요가 없을 것입니다. –

+0

좋아, 나는 조건부 콜백을 사용하여': if => : skip_callback'을 사용하고 crc가 nil인지 검사하는 skip_callback 메소드를 가지고있다. –

관련 문제