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