Подтвердить что ты не робот

Вызов метода, только если он существует

Есть ли скрытая Ruby/Rails-magic для простого вызова метода только в том случае, если он существует?

Предположим, что я хочу позвонить

resource.phone_number

но я не знаю заранее, если ресурс отвечает на phone_number. Способ сделать это -

resource.phone_number if resource.respond_to? :phone_number

Это не все, что красиво, если используется в неправильном месте. Мне любопытно, существует ли что-то, что работает больше в соответствии с тем, как try используется (resource.try(:phone_number)).

4b9b3361

Ответ 1

Если вас не устраивает стандартный синтаксис 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)

будет вести себя так, как вам хотелось.

Ответ 2

Я знаю, что это очень старый пост. Но просто хотел узнать, может ли это быть возможным ответом и будет ли воздействие одинаковым.

resource.try(:phone_number) rescue nil

Спасибо

Ответ 4

Начиная с Ruby 2.3.0 (который до сих пор находится в предварительном просмотре) вы можете использовать новый безопасный оператор навигации запрос функции в системе отслеживания ошибок Ruby. Я также объяснил аргументы в своем ответе здесь.

Ответ 5

Если A.c определено и A.a и A.b нет, вы можете сделать A.a rescue A.b rescue A.c, и он будет работать как шарм. Однако вы будете нарушать некоторые глупые правила.