gpt4 book ai didi

ruby-on-rails - 处理 nil 对象和属性的最佳实践是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:31 24 4
gpt4 key购买 nike

假设我有一个 User 对象,它有一个 email 属性,我需要他们的 email 的最后一个大写字母:

u = User.find(1)    
letter = u.email.upcase.last

如果 uemail 在这个链中是 nil,那么我得到一个 NoMethodError: undefined method 'blah' for nil : 无类。在大多数情况下,我应该能够解决它,但有时,nil 会到达它不应该或难以包含的地方。一种方法会很冗长:

u = User.find(1)
letter = nil
if u && u.email
letter = u.email.upcase.last
end

但这在 View 中或在 a.bunch.of.properties.down.a.hierarchy 的长链中变得烦人和危险。我读到了 Rails 中的 try 方法:

u = User.find(1)
letter = u.try(:email).try(:upcase).try(:last)

这不那么冗长,但我觉得写所有这些尝试都很恶心。一旦我将 try 放入链中,我就必须一直使用它们。有没有更好的办法?

最佳答案

我喜欢使用 Null Object Pattern . Avdi has a great post explaining this ,但基本思想是你有一个小类可以代表一个对象并合理地响应你可能传递给原始对象的消息。我发现这些不仅对避免 NoMethodError 很有用,而且对设置默认值/好消息也很有用。

例如,你可以这样做:

class NilUser
def email
"(no email address)"
end
end

u = User.find(1) || NilUser.new
u.email.upcase.last # => No errors!

关于ruby-on-rails - 处理 nil 对象和属性的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com