Rails спасает/продолжает цикл после каждого блока NoMethodError

Я получаю некоторую информацию об API следующим образом

fetch_api.each do |api|
  save_api = Record.new(name: api.name, height: api.height)
  save_api.save! 
end

Большинство записей сохраняются, без проблем. Но, кажется, некоторым не хватает высоты и имени. Это вызывает NoMethodError с неопределенным методом "высота" или "имя" для nil:NilClass, разрывая цикл.

Я не возражаю, если одна запись не имеет своей ценности. Как я могу продолжить цикл после этого?

Я старался

if !save_api.save
  next
end

без эффекта. (Редактировать: Также пытался сохранить без "!"). Кажется, что каждый блок не принимает rescue. Что еще там?

Большое спасибо заранее


person Kasperi    schedule 26.07.2014    source источник


Ответы (3)


fetch_api.each do |api|
  if api.name && api.height
    save_api = Record.new(name: api.name, height: api.height)
  elsif api.name
    save_api = Record.new(name: api.name)
  elsif
    save_api = Record.new(height: api.height)
  end 
    save_api.save! 
end

Я уверен, что есть более красноречивый способ сделать это, но я думаю, что это сработает. вы также можете использовать оператор case, что было бы лучше, но мне не хочется переписывать все это как таковое.

person ruby_newbie    schedule 26.07.2014

ты можешь сделать это

Record.new do |record|
   if (record.respond_to?(:name) && record.respond_to?(:height)) 
   ...
end
person epsilones    schedule 26.07.2014

Просто сделайте это:

fetch_api.each do |api|
  save_api = Record.new(name: api && api.name, height: api && api.height)
  save_api.save
end
person Ahmad Hussain    schedule 26.07.2014