71

是否有一些隐藏的 Ruby/Rails-magic 仅在方法存在时才调用它?

可以说我想打电话

resource.phone_number

但我事先不知道资源是否响应phone_number. 一种方法是

resource.phone_number if resource.respond_to? :phone_number

如果在错误的地方使用,那并不是那么漂亮。我很好奇是否存在更符合try使用方式的东西(resource.try(:phone_number))。

4

5 回答 5

43

如果您对标准的 ruby​​ 语法不满意,您可以:

class Object
  def try_outside_rails(meth, *args, &cb)
    self.send(meth.to_sym, *args, &cb) if self.respond_to?(meth.to_sym)
  end
end

现在:

resource.try_outside_rails(:phone_number)

将按照您的意愿行事。

于 2013-04-03T12:48:08.390 回答
17

我会尝试defined?http://ruby-doc.org/docs/keywords/1.9/Object.html#defined-3F-method)。它似乎完全符合您的要求:

resource.phone_number if defined? resource.phone_number
于 2015-11-06T08:26:13.383 回答
13

我知道这是很老的帖子。但只是想知道这是否是一个可能的答案以及影响是否相同。

resource.try(:phone_number) rescue nil

谢谢

于 2014-12-10T06:58:28.107 回答
1

我不能说效率,但像......

Klass.methods.include?(:method_name) 

在 Rails 4 中为我工作

于 2018-10-15T15:00:03.180 回答
-2

如果A.c已定义和未定义A.aA.b您可以做A.a rescue A.b rescue A.c,它会像魅力一样工作。不过,你会打破一些愚蠢的规则。

于 2017-04-29T03:13:40.110 回答