2016-09-23 3 views
1

Ruby/RoR을 처음 사용했습니다. 이것은 services/create_subscription.rb입니다. (논리를 캡슐화하고 싶기 때문에 서비스 클래스를 추가합니다.)nil 대신 오류가있는 롤백 및 인스턴스 반환

컨트롤러 내에서 구독 오류를 롤백하고 싶습니다. 여기서 문제는 롤백이 작동하지만, nil을 반환한다는 것입니다. API 호출이 실패한 경우이 메시지는 subscription.errors[:base] << e.message을 반환하고 롤백해야합니다.

코드를 리팩터링하는 아이디어가 있습니까? 예외가이 줄을 제거해야 block.So 거래에서 발생하는 경우 레일이 트랜잭션을 롤백 때문에

class CreateSubscription 
     def self.call(course, email_address) 
     ActiveRecord::Base.transaction do 
     user = CreateUser.call(email_address) 

     subscription = Subscription.new(
      course: course, 
      user: user 
     ) 

     begin 
      book_sub = nil 
      if user.book_customer_id.blank? 
      customer = Book::Customer.create(
       email: user.email, 
       course: course.book_id, 
      ) 
      user.customer_id = customer.id 
      user.save! 
      book_sub = customer.books.first 
      else 
      customer = Book::Customer.retrieve(user.book_customer_id) 
      book_sub = customer.books.create(
       course: course.book_id 
      ) 
      end 

      subscription.book_id = book_sub.id 

      subscription.save! 
     rescue Book::BookError => e 
      subscription.errors[:base] << e.message 
      raise ActiveRecord::Rollback 
     end 

     subscription 
     end 
    end 
    end 

답변

0

당신은 구조 블록의

raise ActiveRecord::Rollback 

필요하지 않습니다.

ActiveRecord :: Rollback의 예외가 블록 외부에 의해 캐치되지 않아서 트랜잭션 블록이 해당 예외를 인식하지 못한다고 생각합니다.

그래서 트랜잭션 블록을 begin 블록 내부에 두어 트랜잭션 블록 외부에서 예외를 catch하십시오.