加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:16:14 所属栏目:百科 来源:网络整理
导读:假设我有一个User对象,它有一个电子邮件属性,我需要他们的电子邮件的上一个字母: u = User.find(1) letter = u.email.upcase.last 如果你或者电子邮件在这个链中是零,那么我得到一个NoMethodError:未定义的方法’blah’为nil:Nilclass.在大多数情况下,我
假设我有一个User对象,它有一个电子邮件属性,我需要他们的电子邮件的上一个字母:
u = User.find(1)    
letter = u.email.upcase.last

如果你或者电子邮件在这个链中是零,那么我得到一个NoMethodError:未定义的方法’blah’为nil:Nilclass.在大多数情况下,我应该可以解决这个问题,但有时候,nil应该在不应该包含的地方或者很难包含它.一种方法是冗长的:

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

但是这在视图中或在a.bunch.of.properties.down.a.hierarchy的长链中变得烦人且危险.我在Rails中读到了关于try方法的内容:

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

这不那么冗长,但我觉得写这些尝试都很蠢.一旦我尝试了链条,我就必须一直使用它们.有没有更好的办法?

解决方法

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

例如,你可以这样做:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读