在Rails/Ruby中检查对象是否存在的正确方法是什么?

mdr*_*iel 5 ruby ruby-on-rails

我有很多模特和关系.由于这个事实,在视图/控制器中有很多调用,如下所示:

 @object.something.with_something.value 
Run Code Online (Sandbox Code Playgroud)

链的某些部分最终可能是零,这是完全可以的.检查终端对象是否存在的正确/清洁/快速方法是什么?

是这样的:

 @object.something.with_something.value if defined? @object.something.with_something.value 
Run Code Online (Sandbox Code Playgroud)

认为好吗?

Bob*_*man 8

在本地,您需要使用&&运算符(不是defined?),但这可能非常冗长,非常快.

所以不要这样做:

(@object && @object.something && @object.something.with_something &&
  @object.something.with_something.value)
Run Code Online (Sandbox Code Playgroud)

您可以在ActiveSupport存在时执行此操作:

@object.try(:something).try(:with_something).try(:value)
Run Code Online (Sandbox Code Playgroud)

或者安装调用构造工具包并使用其保护的评估工具:

Ick::Maybe.belongs_to YourClass
maybe(@object) { |obj| obj.something.with_something.value }
Run Code Online (Sandbox Code Playgroud)