UserモデルとStripeCustomerモデルがあります。すべてのユーザーが1つ埋め込み、StripeCustomerのaccepts_nested_attributes_for。
新しいユーザーを作成するとき、私は常に対応するStripeCustomerを作成し、CCまたはクーポンコードのいずれかを提供する場合は、サブスクリプションを作成します。
私のStripeCustomerで:
attr_accessible :coupon_id, :stripe_card_token
クーポンが無効な場合は、次のようにします。
errors.add :coupon_id, "bad coupon id"
そのため、通常のレールコントローラは次のようにパターン化されます。
if @stripe_customer.save
....
else
....
end
うまくいくでしょう。そして、悪いクーポンを処理するために通常のレールfield_with_errorsのものを使用することができます。
したがって、問題は、どのアクティブレコードコールバックでStripe :: Customer.createを呼び出し、stripe_customer_tokenを保存する必要があるかということです。
あなたが本当にレコードを永続化しようとしている場合にのみそれを実行したいので、私はbefore_createにそれを持っていました。しかし、これは有効な奇妙なことをしますか?さらに悪いことに、Userを介して作成する場合は、before_createコールバックでerrors.addを実行しても、UserとStripeCustomerの保存は実際に成功します。問題は、エラーを追加してbefore_validationでfalseを返した場合にのみ、保存が失敗することだと思います。
その最後の部分は、それがモンゴイドの問題であるかどうかはわかりません。
before_validation:on =>:createに移動できますが、有効と呼んだ場合でも、新しいStripe :: Customerが作成されますか?欲しくない。
とにかく、リモートサービスのレコードにバックアップまたはリンクされているモデルのベストプラクティスと、エラーの処理方法について一般的に興味があります。