防止未定义的链式方法

发布于 2024-12-05 07:10:54 字数 583 浏览 1 评论 0原文

我有一个很长的循环,结果是这样的:

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 效果很好,导致打印出 url。当我到达第 18 条记录时,我遇到了问题

Product.find(18) // product found!
product.find(18).page_url("en_US")
NoMethodError: undefined method `page_url' for nil:NilClass

如何防范这些未定义事件?

url = 产品.page_url("en_US")

I have a long loop that results in this:

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

The method uses products 1-17 works great resulting in a url printed. When I get to my 18th record I have problems

Product.find(18) // product found!
product.find(18).page_url("en_US")
NoMethodError: undefined method `page_url' for nil:NilClass

How can I protect against these undefined events?

url = product.page_url("en_US")

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

往日情怀 2024-12-12 07:10:54

问题是 productnil

<块引用>

nil:NilClass 的未定义方法“page_url”。解决方案:

它与 page_url 可能返回 nil 没有任何关系 code>。)

确保 product 不能为 nil:但要小心,这可能是一个更深层次的问题。无论如何,“修复”这个问题很容易。 。

考虑使用集合 限制(例如 Enumerable#reject):

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

上面使用Symbol#to_proc“Rails 魔法”,但可以与限制一样,{|x| x.nil?} 的缺点是,尽管Enumerable#partition 可以帮助解决这个问题:使用正确的工具来完成这项工作。

另一个解决方案是扩大条件检查本身:

if product && product.page_url("en_US")
   # yay
else
   # uhm
end

&& 的短路性质将确保 page_url 仅在真值时调用(不包括 nil )。

我还冒昧地假设 page_url 无法返回 false,因为我发现这使得意图更加清晰。

快乐编码。

The issue is that a product is nil:

undefined method 'page_url' for nil:NilClass". Solution:

(It has nothing to do with page_url maybe returning nil.)

Make sure product can't be nil: but be wary that this may be a deeper issue. In any case, "fixing" this issue is easy to deal with.

Consider either using a collection restriction (such as Enumerable#reject):

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

The above uses the Symbol#to_proc "Rails magic", but could just as easily have been {|x| x.nil?} as the restriction. The downside is it's not practical to use this for a "no URL" condition per-product although Enumerable#partition could help with that: use the right tool for the job.

Another solution is to expand the conditional check itself:

if product && product.page_url("en_US")
   # yay
else
   # uhm
end

The short-circuit nature of && will ensure page_url is only invoked upon a truthy value (which excludes nil).

I also took the liberty of assuming page_url can't return false as I find this makes the intent more clear.

Happy coding.

谈下烟灰 2024-12-12 07:10:54

试试这个:

product.find(18).try(:page_url, "en_US")

但它是性能杀手。

您确定 Product.find(18) 不会返回 nil 吗?

无论如何,你可以这样做:

url = product.nil? ? "no_url" : product.page_url("en_US")

Try this:

product.find(18).try(:page_url, "en_US")

But it's a perf killer.

Are you sure Product.find(18) doesn't return nil ?

Anyway, you could do:

url = product.nil? ? "no_url" : product.page_url("en_US")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文