2016-09-23 5 views
1

Я новичок в Ruby/RoR. Это services/create_subscription.rb. (Я добавляю класс обслуживания, потому что я хотел инкапсулировать логику.)Пример возврата и возврата с ошибкой вместо нуля

Я хотел бы откатить и отключить ошибки подписки в контроллере. Проблема в том, что Rollback действительно работает, но возвращает nil. Это должно возвращать subscription.errors[:base] << e.message и откат, если API-вызов потерпел неудачу.

Любые идеи по реорганизации кода?

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 

в спасательном блоке, поскольку Rails откатов транзакции, когда происходит исключение в транзакции block.So вы должны удалить эту строку.

И как исключение ActiveRecord :: Rollback не улавливается вне блока , я думаю, ваш блок транзакций не знает об этом исключении.

Итак, попробуйте поместить блок транзакций внутри начального блока, чтобы исключить исключение за пределами блока транзакций.