打破并返回值的最佳方法

Dou*_*oug 2 ruby return ruby-on-rails break

我有一个嵌套在其他几个方法中的方法,我希望这个方法break来自所有带有返回错误的递归方法.例如,如果我pay_order在这里被叫:

class API::StripeController < ApiController
  def my_api_action
    # ...
    order = create_order
    pay_order(order, token)
    # do things if payment is successful
  end
end
Run Code Online (Sandbox Code Playgroud)

pay_order定义为:

def pay_order(order, token)
  begin
    order.pay(source: token)
  rescue Stripe::CardError => e
    break e
  end
end
Run Code Online (Sandbox Code Playgroud)

如何突破所有父方法并返回来自付款失败的卡错误?我需要这样的东西break and return ereturn e and break.但是我知道这些breakreturn语句都会立即返回,所以我不能将它们链接起来(我不认为).

我可以只添加return语句来调用各项功能,但我打算在很多地方使用这种方法,而不要永远需要它的行为方式不同计划,所以我在寻找写它的最可重用的方式.

coo*_*sse 5

为什么你rescue在这个pay_order方法里面?我在外环上救援.鉴于以下内容:

def method_a
  10.times do |loop_a|
    method_b
  end
end

def method_b
  5.times do |loop_b|
    pay_order
  end
end

def pay_order
  ...
end
Run Code Online (Sandbox Code Playgroud)

我在里面拯救method_a,例如:

def method_a
  10.times do |loop_a|
    method_b
  end
rescue Stripe::CardError => e
  # do whatever. no need to break
end
Run Code Online (Sandbox Code Playgroud)

通过引发异常,所有循环都会自动"中断".

如果你想在pay_order方法中对异常做一些事情,那么我建议再次进行救援和提升:

def pay_order
  order.pay
rescue Stripe::CardError => e
  # do your stuff
  raise e
end
Run Code Online (Sandbox Code Playgroud)