2014-12-08 2 views
0

У меня есть следующий метод в моей команде rake.Ruby каждый блок следующий, когда возникает ошибка или исключение

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 

Если есть заказ, не отслеживая номером я Пропускаем с next на линии 5.

Мой вопрос: Как бы я 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 
+0

Я думаю, что вы будете нуждаться в 'начать \ rescue', чтобы справиться с этим, например 'Начать; ВАШ ТРЕБОВАНИЯ КОДА ЗДЕСЬ; спасение Fedex :: RateError => e; #maybe запишите ошибку; следующий; end' – engineersmnky

+0

Не беспокойтесь, решил. спасибо за редактирование и помощь. – neo

ответ

1

добавил:

private 

def fedex_track(tracking) 
    fedex.track(tracking_number: tracking) 
end 

и переменил results на линии 7:

results = fedex_track(order_tracking) rescue next 
+0

метод extract кажется излишним ... –

+0

Согласен, может быть, немного чище, но это субъективно. – neo

+0

Также я бы предложил только спасти «Fedex :: RateError» прямо сейчас, вы спасаете каждую ошибку, которая обычно считается плохой идеей и делает отладку намного сложнее. – engineersmnky

Смежные вопросы