コントローラー・アクション内の長い一連のイベントの1つが失敗することがあります。たとえば、クレジットカードが処理された後、ActiveRecordクエリがタイムアウトします。これらの通話を可逆にする方法はありますか?Railsコントローラのアクションをアトミックにしますか?
など。このコントローラのアクションで:
def process_order
cart = Cart.new(params[:cart])
load_order
response = credit_card.charge
if response
submit_order
order.receipt = Pdf.new(render_to_string(:partial => 'receipt')
order.receipt.pdf.generate
order.receipt.save
render :action => 'finished'
else
order.transaction = response
@message = order.transaction.message
order.transaction.save
render :action => 'charge_failed'
end
end
私はそうのようにその周りのブロックを置くことができるようにしたいと思い
:
def process_order
transaction
cart = Cart.new(params[:cart])
load_order
response = credit_card.charge
if response
submit_order
order.receipt = Pdf.new(render_to_string(:partial => 'receipt')
order.receipt.pdf.generate
order.receipt.save
render :action => 'finished'
else
order.transaction = response
@message = order.transaction.message
order.transaction.save
render :action => 'charge_failed'
end
rollback
credit_card.cancel_charge
...
end
end
これは単なる不自然な例であると私は本当にわからないんだけどそれはどのようにだろう実際に働く。典型的には、submit_order
の行に対してActiveRecord::StatementInvalid: : execution expired
のような例外が発生し、次に実行しなければならない残りの行を手動で実行する必要があります。
非常に良い。このソリューションを見ると、同僚はステートマシンを使用するように提案しました。これは特定の状況で使用できますが、これは一般的な解決策です。 –