尝试方法更好的替代方案

use*_*677 2 ruby ruby-on-rails activesupport

我想要一个干净的代码,我觉得这很笨重.

有一个更好的方法吗?

User.try(:profile).try(:settings).try(:card).try(:options)
Run Code Online (Sandbox Code Playgroud)

如果我删除了try方法,我会得到一个nil方法错误.

是否还有另一段代码可以执行以下操作:

User.try(:profile,:settings, :card, :options)
Run Code Online (Sandbox Code Playgroud)

Зел*_*ный 5

从ruby 2.3.0开始,您可以使用&.方法代替try:

User&.profile&.settings&.card&.options
Run Code Online (Sandbox Code Playgroud)

但你应该避免这样的事情.

当您向可能返回nil的对象发送消息或者对象没有响应该消息时,这是一个您应该自己解决的问题.使用try只会加剧问题,就像nil-checking那样.编写一致行为的一致接口.