繁体   English   中英

创建新记录并仍然正确使用错误时,哪个ActiveRecord回调与服务(条带)同步?

[英]Which rails ActiveRecord callback to sync with service (stripe) when creating a new record and still properly use errors?

我有一个用户和一个StripeCustomer模型。 每个用户嵌入一个并接受StripeCustomer的_nested_attributes_for。

创建新用户时,我总是创建一个相应的StripeCustomer,如果您提供抄送或优惠券代码,则会创建一个订阅。

在我的StripeCustomer中:

attr_accessible :coupon_id, :stripe_card_token

我想做的是,如果优惠券无效,请执行以下操作:

errors.add :coupon_id, "bad coupon id"

这样普通的rails控制器会发出类似以下的提示:

if @stripe_customer.save
    ....
else
    ....
end

会工作。 并能够使用普通rails field_with_errors来处理错误的优惠券。

所以问题是,我应该在哪个活动记录回调中调用Stripe :: Customer.create并保存stripe_customer_token?

我将它放在before_create上,因为仅当您真正要保留记录时才希望这样做。 但这对奇怪的事情有效吗? 更糟糕的是,如果您打算通过User创建它,则即使您执行error,User和StripeCustomer的保存实际上也会成功 。添加到before_create回调中! 我认为问题在于,仅当您添加错误并在before_validation处返回false时,保存才会失败。

最后一部分,我不确定这是否是蒙古类问题。

我可以将其移动到before_validation:on =>:create,但是即使我刚刚调用有效,它也会创建一个新的Stripe :: Customer? 我不要

无论如何,我通常对由远程服务上的记录支持或链接到的任何模型的最佳实践是什么以及如何处理错误感到好奇。

好的,这就是我所做的,我将stripe的调用分为2个回调,一个在before_validation上,一个在before_create(或before_update)上。

在before_validation中,我将尽一切努力检查不受控制的输入(直接来自用户)是否有效。 在条纹情况下,这仅表示优惠券代码,因此我检查条纹是否有效,并根据需要向:coupon_code添加错误。

实际使用条纹创建/更新客户时,我一直等到before_create / before_update(我使用两个,而不是仅仅使用before_save,因为我对这两种情况的处理不同)。 如果有错误,那么我只是不处理异常,而不是尝试在验证后添加错误,这(a)并没有任何意义,(b)可以进行一些工作,但无法防止在嵌套模型上进行保存(无论如何,这是非常糟糕和奇怪的)。

这样,我在坚持下去的时候就知道所有属性都是正确的。 某些事情当然仍然会失败,但是我已将风险降到最低。 现在,我还可以执行电话有效之类的事情? 不用担心用我不需要的条纹创建记录。

回想起来,这似乎很明显。

我不确定我是否完全了解这种情况。 你写了:

每个用户嵌入一个并接受StripeUser的_nested_attributes_for

您是说StripeCustomer吗?

因此,您有一个拥有持有优惠券信息的客户的用户吗?

如果是这样,我认为在用户中接受客户的嵌套属性就足够了,将验证放入客户代码即可。 这里

让我知道我是否误解了您的问题...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM