Rails спасает альтернативу NoMethodError - PullRequest
0 голосов
/ 10 марта 2020

Я создаю код, который должен работать в разных средах (с небольшой разницей в коде каждая). Один и тот же класс может определять метод в одном, но не в другом. Таким образом, я могу использовать что-то вроде:

rescue NoMethodError

, чтобы перехватить событие, когда метод не определен ни в одном конкретном классе, но перехват исключений не является правильным логином c flux.

Существует ли альтернатива, например, present , чтобы узнать, определен ли метод в определенном классе? Этот класс является службой, а не ActionController

Я думал о чем-то вроде:

class User
  def name
    "my name"
  end
end

А потом

User.new.has_method?(name)

Или что-то подобное.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Это возможно дублирование Для данного класса посмотрите, есть ли у экземпляра метод (Ruby)

По ссылке выше: Вы можете использовать это:

User.method_defined?('name')
# => true

Как и другие, вы можете посмотреть на отсутствующий метод:

class User
  def name
    "my name"
  end

  def method_missing(method, *args, &block)
    puts "You called method #{method} using argument #{args.join(', ')}"
    puts "--You also using block" if block_given?
  end
end

User.new.last_name('Saverin') { 'foobar' }
# => "You called last_name using argument Saverin"
# => "--You also using block"

Если вы не знаете о ruby метапрограммировании, вы можете начать с здесь

1 голос
/ 10 марта 2020

Как показано здесь: https://ruby-doc.org/core-2.7.0/Object.html#method -i-response_to-3F это метод для объекта. Поэтому он проверит любой объект для этого метода и ответит true или false.

class User
  def name
    "my name"
  end
end

User.new.respond_to?(name)

вернет true

В Rails есть метод try, который может попытаться использовать метод, но не выдаст ошибку, если метод не существует для этого объекта.

@user = User.first
#=> <#User...>

@user.try(:name)
#=> "Alex"

@user.try(:nonexistant_method)
#=> nil

Возможно, вы ищете что-то вроде method_missing, ознакомьтесь с этой статьей об этом: https://www.leighhalliday.com/ruby-metaprogramming-method-missing

...