2017-10-22 4 views
0

컨트롤러 호출로 트리거 된 다음 작업을 수행하는 데 사용되는 코드가 있습니다. 레일스 트랜잭션을 시작/복구 엔드 블록과 함께 사용하여 아래 시리즈를 만듭니다. 같은 더 robust.Its 코드 실행은 다음과 같습니다 :레일 4 - 함께 트랜잭션 사용하기 복구 블록

  1. 저장을
  2. 속성 값을 연관을 저장하고 업데이트 할 객체를
  3. 보내기 이메일
  4. 보내는 문자 메시지
  5. ###in my controller 
    def verify 
        @request=Request.includes(:user).find(params[:id]) 
        @request.transaction do 
         begin 
         if @request.accepted? 
          ##this method will call 3 more methods in the request model 
          @request.send_email_and_sms 
          flash[:success] = "Request is moved to another state" 
         else 
          flash[:error] = "Request was not accepted and couldn't be moved to another state" 
         end   
         rescue 
         flash[:alert] = "There was some internal error.Kindly debug" 
         ensure 
         @request.reload 
         Rails.logger.info "================Making GO AHEAD TOKEN FALSE AND DEACTIVATE VENUE====================#{@request.attributes}===========" 
         redirect_to request_hall_path(@request.user) 
         end  
        end  
        end 
    

    `

코드의 모든 조각이는 flash.alert 메시지 구조에 이동합니다 다른 실행할 수 있도록하기 위해이 올바른 방법인가 리디렉션합니다.

이 코드/로직을 더 어리석은 증거로 만들기 위해 누락 된 다른 방법이 있습니까?

미리 감사드립니다.

+0

request.update(email_sent: true)

희망처럼 할 수 있도록 그래서 콜백을 등록합니다. 전자 메일 및 SMS 배달은 일시적으로 실패 할 수 있으며 데이터베이스 변경 내용을 롤백해서는 안됩니다. 대신 실패한 작업을 재 시도 할 작업 큐를 사용해야합니다. – meagar

+0

고마워요 @ meagar, 만약 내가 이메일/SMS를 보내고 그들을 처리 async..is이 코드는 여전히 강력하거나 수정이 필요 제거 제거 할 수 있습니까? – Milind

답변

0

여기서 거래 블록이 필요하다고 생각하지 않습니다. '모두 또는 아님'요구 사항이있을 때 트랜잭션을 사용하려고합니다. 예를 들면 제품 판매 및 송장 작성과 같은 것일 수 있습니다. 순서 중 하나에서 시퀀스가 ​​실패하고 데이터베이스 상태가 일치하지 않기를 원할 것입니다 (예 : 재고 수량에서 차감하지 않고 판매에 추가).

또한 귀하의 경우 (위의 의견에서) 전자 메일을 보내고 sms는 비동기 작업을 통해 수행되어야하므로 현재 스레드를 차단하지 않습니다.

어쨌든 나는이 같은 일이 잘 될 것이라고 생각 :

def verify 
    @request = Request.includes(:user).find(params[:id]) 

    if @request && @request.accepted? 
    ##this method will call 3 more methods in the request model 
    @request.send_email_and_sms # send async 
    flash[:success] = "Request is moved to another state" 
    else 
    flash[:error] = "Request was not accepted and couldn't be moved to another state" 
    end 

    redirect_to request_hall_path(@request.user) 
end 

당신의 #send_email_and_sms 어떤 DB가있는 경우 씁니다 그때는 아마 작업 후크 (예 : delayed_job 콜백)를 사용할 수 있도록 쓰기를 할 작업이 성공적으로 완료되었음을 알고 있습니다. 이메일 및 SMS가 성공적으로 발송되었습니다 때 도움이 :) 당신은 아마 트랜잭션 내부 이메일이나 문자 메시지를 전송해서는 안

관련 문제