我有一个长循环,结果是:

csv_code = CSV.generate do |csv|
  csv << ["Product ID","Name", "Url"]
  @all_products.each do |product|
      if product.page_url("en_US") != nil
      turl = product.page_url("en_US")
      end
    csv << [product.name,product.d_id, turl]
  end
end

该方法使用的产品1-17作品伟大,导致一个网址打印。当我拿到我的第18张唱片时我有问题
Product.find(18) // product found!
product.find(18).page_url("en_US")
NoMethodError: undefined method `page_url' for nil:NilClass

我怎样才能防止这些未定义的事件?
url=product.page_url(“en_us”)

最佳答案

问题是aproductnil
nil:nilclass的未定义方法“page_url”。解决方案:
(这与page_url可能返回nil无关)
确保product不能是nil:但要小心这可能是一个更深层次的问题。无论如何,“修复”这个问题很容易解决。
考虑使用集合限制(例如Enumerable#reject):

@all_products.reject(&:nil?).each do {
   ...
}

上面使用了Symbol#to_proc "Rails magic",但也可以像限制一样容易地{|x| x.nil?}。缺点是,虽然Enumerable#partition有助于解决这个问题,但对于每种产品来说,将其用于“无url”条件并不实际:使用正确的工具来完成任务。
另一种解决方案是展开条件检查本身:
if product && product.page_url("en_US")
   # yay
else
   # uhm
end

&&的短路特性将确保仅在truthy值(不包括page_url)时调用nil
我还冒昧地假设page_url不能返回false,因为我发现这使意图更加明确。
快乐的编码。

10-04 15:11
查看更多