2016-09-23 44 views
1

我是Ruby/RoR的新手。 这是services/create_subscription.rb。我想添加服务类,因为我想封装逻辑。)回滚并返回错误而不是零的实例

我想回滚并将订阅错误放在Controller中。 这里的问题是回滚确实有效,但返回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的异常没有在 块之外捕获,我猜你的事务块不知道这个异常。

因此,请尝试将事务块放入begin块中,以捕获事务块外的异常。

相关问题