2015-06-01 8 views
2

В моем классе «Контакты» после того, как контакт создан с их адресом электронной почты, я стараюсь как можно больше извлекать данные контакта из API FullContact.Rails 4 - Как спасти от NoMethodError и продолжить метод?

У меня возникла эта проблема, если, если один столбец данных не существует для «человека» в FullContact, он генерирует NoMethodError, и я не могу сохранить остальные данные, которые потенциально существуют для контакт, потому что мой метод останавливается при ошибке.

Как я могу избавиться от NoMethodError и заставить мой метод продолжить работу над остальной частью? Например, чтобы просто пропустить ошибку и попробовать остальную часть кода. Я пробовал next и continue в моем коде спасения, но это не работает.

Спасибо за любую помощь.

class Contact < ActiveRecord::Base 
    belongs_to :user 

    after_create do |contact| 
    contact.delay.update_fullcontact_data 
    end 

    def update_fullcontact_data 

    person = FullContact.person(self.email) 

    if person.contact_info.given_name.present? 
     self.name = person.contact_info.given_name 
    end 

    if person.contact_info.family_name.present? 
     self.last_name = person.contact_info.family_name 
    end 

    if person.demographics.location_general.present? 
     self.city = person.demographics.location_general 
    end 

    save! 

    rescue NoMethodError => exception 
    puts "Hit a NoMethodError" 
    save! 
    end 
end 
+0

Я не думаю, что это хорошая идея, чтобы спасти NoMethodError, как это ... вы можете в конечном итоге неприятности нарваться неожиданные поведения, такие, как вы сделать опечатку и по-прежнему спасает его и сохранить , и вы понятия не имеете, где это происходит от – Edward

+0

Хорошая точка. Однако я в настоящее время все еще спасаю от NoMethodError, потому что я решил, что лучше всего извлекать данные из FullContact, учитывая, что мы платим за успешный вызов api. Открыта для альтернатив. – user2101461

+0

вы также можете использовать. чтобы проверить, присутствует ли какой-либо метод, кроме попытки ударить его независимо и спасти от исключения (для приложений, отличных от rails) – Edward

ответ

6

в целом, что может быть решением для вашей проблемы try метод (http://apidock.com/rails/Object/try). Чтобы сделать короткий рассказ - он возвращает ноль, а не поднимать исключение, если метод не существует на конкретном объекте

+0

Hmm @djaszczurowski, как бы вы это сделали с кодом, который я даю? – user2101461

+0

'if person.try (: contact_info) .try (: family_name) .present? self.last_name = person.contact_info.family_name end' если метод contact_info гарантировано, то я бы назвал 'если person.contact_info.try (: family_name) .present' – djaszczurowski

+0

Работал как шарм, и я узнал что-то новое?. Благодаря! – user2101461

1

Если вы просто хотите, чтобы убедиться, что он экономит, вы можете использовать ensure сделать что-то вроде этого:

class Contact < ActiveRecord::Base 
    belongs_to :user 

    after_create do |contact| 
    contact.delay.update_fullcontact_data 
    end 

    def update_fullcontact_data 

    person = FullContact.person(self.email) 

    if person.contact_info.given_name.present? 
     self.name = person.contact_info.given_name 
    end 

    if person.contact_info.family_name.present? 
     self.last_name = person.contact_info.family_name 
    end 

    if person.demographics.location_general.present? 
     self.city = person.demographics.location_general 
    end 

    save! 

    ensure 
    save! 
    end 
end 

Подробнее: http://blog.rubybestpractices.com/posts/rklemme/003-The_Universe_between_begin_and_end.html