1

我正在使用服务对象将条纹支付功能抽象到它自己的类中。我正在使用ryan bates 谈到的这种方法https://gist.github.com/ryanb/4172391 。

class Purchase
  def initialize(order)
    @order = order
  end

  def create_customer
    customer = stipe create customer
    if customer
       charge_customer(customer)
    else
       stipe error in creating customer
    end
  end

  def charge_customer(customer)
      if charge is sucessfull
         update_order(charge details)
      else
         stripe error in charging card
      end     
  end
  def update_order
     @order.update(payment attributes)
  end
end

然后在订单控制器中我正在做类似的事情

def create
@order = Order.new(params[:order])
 if @order.save
    payment = Payment.new(@order)
 else 
   render 'new' with flash message "payment error"
 end
end

我的问题是,我如何获得显示给用户的 stipe 错误消息(“创建客户时出现错误”和“收费卡中出现条纹错误”)?或者我可以在订单模型中调用服务对象并将其添加到订单错误消息中吗?例如,
订单控制器

@order.save_with_payment

订购型号

def save_with_payement
   payment = Payment.new(self)
   #update order 
   self.payment_token = payment.token
   etc
end

如果我可以用模型做到这一点,我如何进行显示条纹错误的验证?
提前致谢。

4

4 回答 4

2

首先尽量分离关注点。感觉你的购买/支付类做的太多了,可能它应该将部分例程委托给其他服务对象。

其次,我同意phoet。我看不出您不将参数哈希传递给服务对象的原因。在我们最新的项目中,我们完全依赖我们称为工厂的服务对象来生产/操作我们的模型对象。在您的情况下,您可以这样做:

class OrderFactory
  def self.create(params)
    new(params).create
  end

  def initialize(params)
    @order = Order.new(params[:order])
  end

  def create
    @payment = Payment.new(self)
    @order.payment_token = payment.token
    #....
  end
end

谈论验证 - 您可以将验证方法添加到普通的 Ruby 对象。例如通过使用 ActiveModel:http: //yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ 然后您可以创建自定义验证器,就像 Ryan 建议的那样。

或者您可以使用像Virtus这样的 gem并添加一些自定义验证规则。

于 2013-10-10T13:37:07.813 回答
0

我认为该服务应该负责处理这一切。所以它可能看起来像这样

def create
  @payment = Payment.new(params[:order])
  if @order = @payment.execute_transaction
    [...]
  else 
    [...]
  end
end

因此支付服务将处理订单的创建和持久化,并且还可能添加验证错误。您还可以返回某种@result可能包含订单和相关错误消息的对象。

于 2013-10-10T13:06:56.177 回答
0

就在一天前,我问了一个非常相似的问题。我收到的回复确实很有帮助(感谢@gary-s-weaver),所以看看吧。

Rails 通用错误数组

最后我采用了 rescue_from 方法,它对我来说效果很好。让我知道你的进展,因为我对这个领域非常感兴趣。如果您需要任何代码示例,请给我留言。

于 2013-10-10T18:24:14.540 回答
0

我为服务对象编写了一个 gem。查看孔雀宝石。

于 2018-05-11T17:47:47.893 回答