我有一个长循环,结果是:
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”)
最佳答案
问题是aproduct
是nil
:
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
,因为我发现这使意图更加明确。快乐的编码。