홈>
Rails 5에서 파괴를 막는 유일한 방법은
throw(:abort)
에 전화하는 것입니다
;그리고 이것은 예상대로 작동합니다. 그러나 내가 겪고있는 문제는 레코드가 요구 사항을 충족하지 않고 파괴하지 않고 레코드를 수정하려는 경우입니다. 그러나
throw(:abort)
전체 거래가 되돌리고 레코드가받은 변경 사항을 취소합니다.
이를 달성하는 방법에 대한 제안이 있으십니까?
class Thing < ApplicationRecord
before_destroy :can_destroy?
private
def can_destroy?
if model.something?
self.update(something: 'foo') # This part is not being retained.
throw(:abort)
end
end
- 답변 # 1
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- JavaScript 변수를 HTML div에 '출력'하는 방법
- python - 문자열에서 특정 문자 제거
당신이 겪고있는 문제는 ActiveRecord가 트랜잭션의 모든 전후 콜백을 트랜잭션으로 래핑하여 실패 할 경우 데이터베이스에 결과가 커밋되지 않도록하는 것입니다. 슬프게도, 당신은 당신을 보호하려고하는 것을 정확하게하고 싶습니다. 이 작업을 수행하는 "좋은"방법은 없지만이 제한을 극복하기위한 약간의 해킹은
after_rollback
에서 업데이트를 수행하는 것입니다. 당신의throw(:abort)
때문에 콜백 트랜잭션 롤백이 발생합니다. 예를 들면 다음과 같습니다.