2015-08-12 1 views
0

Я делаю карту для форматирования некоторых данных для экспорта PDF. Часть этого использует OpenURI для открытия изображения. Однако проблема заключается в том, что некоторые ссылки на изображения связаны с внешними сайтами и сломаны. Таким образом, я случайно получаю 404 ошибки ...Как спасти 404s от OpenURI на карте

Я попытался сделать спасение на карте, но это ошибки. Я попытался сделать спасение внутри метода, но тогда это не приводит к отсутствию данных. Каков правильный способ сделать это?

В идеале я хотел бы установить изображение в качестве изображения-заполнителя, которое у меня есть на моем сервере. Было бы лучше определить отдельный метод для этого?

Вот мой метод на данный момент:

def wish_list_item_rows 
    WishListItem.where(:wish_list_id => @wish_list.id).map { |wishlistitem| [wishlistitem.product.name, {:image => open(wishlistitem.product.image_url)}] } 
    end 

ответ

1

Вы можете спасти в блоке карты (вы можете получать с синтаксисом немного выключить), но это будет в целом чище, чтобы переместить спасение в его собственный метод. Заменить open с помощью вызова метода, как

def safe_open(url) 
    open(url) 
rescue # put a specific error class here ideally 
    load_placeholder_image 
end 

законченного Код:

def safe_open(url) 
    if url.blank? 
     safe_open = "#{Rails.root}/app/assets/images/placeholder.png" 
    else 
     open(url) 
    end 
    rescue OpenURI::HTTPError => e 
    if e.message == '404 Not Found' 
     safe_open = "#{Rails.root}/app/assets/images/placeholder.png" 
    end 
    end 
+1

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

+0

Эй, @JeremyRodi какие-нибудь идеи о том, как этого достичь? Это хорошо работает для меня, но понимаю вашу мысль. Хотелось бы услышать ваши мысли – bnussey

+0

@bnussey 'open-uri' использует' Net :: HTTP' под капотом, поэтому вы, вероятно, можете это использовать. Или вы можете использовать HTTP-камень, который выполняет запросы для вас. –