Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从地图中的OpenURI中拯救404_Ruby On Rails_Ruby_Open Uri - Fatal编程技术网

Ruby on rails 如何从地图中的OpenURI中拯救404

Ruby on rails 如何从地图中的OpenURI中拯救404,ruby-on-rails,ruby,open-uri,Ruby On Rails,Ruby,Open Uri,我正在制作一张地图,以便为PDF导出适当地格式化一些数据。其中一部分是使用OpenURI打开图像。然而,我遇到的问题是,一些图像链接是指向外部站点的,并且已断开。所以我随机得到404个错误 我试着在地图上进行营救,但它出错了。我尝试过在方法中进行救援,但没有得到任何数据。正确的方法是什么 理想情况下,我希望将图像设置为服务器上的占位符图像。最好先定义一个单独的方法来处理这个问题吗 以下是我目前的方法: def wish_list_item_rows WishListItem.wher

我正在制作一张地图,以便为PDF导出适当地格式化一些数据。其中一部分是使用OpenURI打开图像。然而,我遇到的问题是,一些图像链接是指向外部站点的,并且已断开。所以我随机得到404个错误

我试着在地图上进行营救,但它出错了。我尝试过在方法中进行救援,但没有得到任何数据。正确的方法是什么

理想情况下,我希望将图像设置为服务器上的占位符图像。最好先定义一个单独的方法来处理这个问题吗

以下是我目前的方法:

  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

您可以在地图块中进行救援(您可能会稍微偏离语法),但将救援移动到自己的方法通常会更干净。将
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

我想补充一点,从错误中执行
救援
相对来说是一项非常耗时的任务,因此我建议看看是否有一种方法可以在不使用异常的情况下检查404错误是否发生。嘿@JeremyRodi,关于如何实现这一点,有什么想法吗?这对我来说很有效,但请理解你的观点。我想听听你的意见thoughts@bnussey
openuri
在引擎盖下使用
Net::HTTP
,因此您可能可以使用它。或者,您可以使用HTTP gem为您执行请求。如果您希望PDF的断开链接少于100个,并且您在一秒钟内生成的PDF不超过几个,那么用于从错误中恢复的额外时间应该不会太长。