Behavior of redirect_to in rescue block
我想知道我是否正确理解了Ruby中的begin / rescue构造。 我阅读了Ruby文档,但我仍然不确定我是否清楚。 我正在我正在构建的Rails站点中实现Stripe付款。 Stripe建议使用begin / rescue。 我在基于stripe.com的文档的支付控制器中有以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| begin
charge = Stripe::Charge.create(
:amount => @amount,
:card => token,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charges_path
end
@payment = Payment.new(params[:payment])
if @payment.save
flash[:notice] ="Payment taken for #{number_to_currency(@amount/100)}."
else
flash[:notice] ="Payment record not created."
redirect_to charges_path
end |
如果对条带的收费失败,我不希望在begin / rescue结束之后以@payment开头的部分运行。 它看起来在条带充电失败时,救援代码将运行,导致rails重定向到charges_path,并且后续的@payment代码将无法运行,这是我想要的行为。 我理解正确吗?
-
这是控制器的很多代码。你为什么不写一个测试来断言你想要的行为确实发生了什么?
-
这也与rescue没什么关系,更多的是关于redirect_to的行为。
-
控制器是rails的Stripe文档建议它去的地方(所有代码减去最后7行几乎是从Stripe文档逐字逐句)。如果不是控制器,我会把这段代码放在哪里?也许是帮手?
-
不,不是帮手。管理实际充电的其他一些对象。想想当你必须在其他地方充电时会发生什么 - 你又重新做了这件事吗?此外,控制器方法应该是最短的,但这个是近20行 - 这是很多。
-
谢谢,安德鲁。由于我使用rails的noobie状态,我知道放置逻辑的唯一地方是控制器,帮助器,模型和视图。此代码当然不属于视图,模型无法访问params []。那么,如果不是控制器或帮助器(甚至可能不是应用程序助手?),我可以在哪里创建该对象来处理费用?
-
任何你想的地点都可以。 Rails是一个框架,而不是您的应用程序。不要让它限制您的应用程序的设计方式。
在redirect_to之后添加return语句,即
1
| return redirect_to(charges_path) |
要么
1 2
| redirect_to(charges_path)
return |