[英]Ruby each block next when exception or error is raised
我的耙子任務中有以下方法。
def call
orders = Spree::Order.complete.where('completed_at >= :last_day', last_day: Time.now - 30.days)
orders.each do |order|
order_tracking = order.shipments.first.tracking
next if order_tracking.nil?
shipment = order.shipments.first
results = fedex.track(tracking_number: order_tracking)
tracking_info = results.first
status = tracking_info.status.to_s
delivery_date = tracking_info.delivery_at
shipment.is_delivered = delivered?(status)
shipment.date_delivered = delivery_date
shipment.save
puts "-> Shipping status was updated for #{order.number}"
end
end
如果有沒有追蹤編號的訂單,我會在第5行的next
跳過它。
我的問題:我怎么會做next
,如果一個跟蹤號碼是無效的,下面引發錯誤:
Fedex::RateError: Invalid tracking number.
理想情況下,我想將第5行更改為:
next if order_tracking.nil? || order_tracking.raised(Fedex::RateError) # something like that
先感謝您。
還會在此處引發RateError:
def process_request
api_response = self.class.post(api_url, :body => build_xml)
puts api_response if @debug == true
response = parse_response(api_response)
if success?(response)
options = response[:track_reply][:track_details]
if response[:track_reply][:duplicate_waybill].downcase == 'true'
shipments = []
[options].flatten.map do |details|
options = {:tracking_number => @package_id, :uuid => details[:tracking_number_unique_identifier]}
shipments << Request::TrackingInformation.new(@credentials, options).process_request
end
shipments.flatten
else
[options].flatten.map do |details|
Fedex::TrackingInformation.new(details)
end
end
else
error_message = if response[:track_reply]
response[:track_reply][:notifications][:message]
else
"#{api_response["Fault"]["detail"]["fault"]["reason"]}\n--#{api_response["Fault"]["detail"]["fault"]["details"]["ValidationFailureDetail"]["message"].join("\n--")}"
end rescue $1
raise RateError, error_message
end
end
添加:
private
def fedex_track(tracking)
fedex.track(tracking_number: tracking)
end
並將第7行的results
更改為:
results = fedex_track(order_tracking) rescue next
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.