Преобразовать строку в имя класса без ошибки - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь преобразовать строку в имя класса, используя constantize.Но он выдает ошибку, если имя класса отсутствует, или строка пуста, или nil.

Есть ли способ преобразовать строку в имя класса, не выбрасывая ошибку.Или возвращает false, только если не удалось преобразовать.

Ответы [ 5 ]

0 голосов
/ 13 декабря 2018

Я ненавижу Rails, он приносит кучу избыточных так называемых помощников, имеющих нулевое значение в целом.Это может быть легко сделано с чистым Ruby:

Kernel.const_get(string) if Kernel.const_defined?(string)

Вышеприведенное эффективно возвращает класс или nil (что неверно в Ruby), если класс не определен.

0 голосов
/ 13 декабря 2018

Во-первых, я хочу отметить кое-что из ответов выше.rescue false означает, что все виды исключений, выданных из этого выражения, спасены как ложные.Это означает, что даже если у вас есть объект исключения класса NoMethodError или RuntimeError, вы вернете false, и вы ожидаете, что постоянная строка не будет соответствовать константе в вашем приложении.Это может привести к часам отладки, если вы не знаете, как работает система обработки ошибок в ruby.Это также место для внесения множества ошибок в ваш код в будущем.

Я вижу тег ruby-on-rails , поэтому я предполагаю, что вы столкнулись с проблемой в railsприложение.Вы можете использовать вспомогательный метод из модуля ActiveSupport::Inflector.Вместо того, чтобы спасать метод constantize, вы, вероятно, захотите использовать safe_constantize.Он вернет nil, если константа отсутствует в вашем проекте.

Пример использования (обратите внимание, я не определил Foo константу в моем проекте):

# with constantize
irb(main) > 'foo'.constantize
=> NameError (wrong constant name foo)

# with safe_contantize 
irb(main) > 'foo'.safe_constantize
=> nil
0 голосов
/ 13 декабря 2018

В случае nil вы можете указать значение по умолчанию или вернуть его раньше, а затем восстановить NameError:

def to_class(name)
   # default to empty string
   (name || "").constantize
rescue NameError
   false 
end 

def to_class(name)
   # guard against invalid input
   return false if name.nil?

   name.constantize
rescue NameError
   false 
end 

РЕДАКТИРОВАТЬ: оно длиннее простого

string.constantize rescue false

но IMO вы должны спасти наиболее конкретную ошибку, какую только можетеrescue false подходит для простых сценариев или некоторых тестовых случаев.В рабочем коде это довольно рискованно - вы можете скрыть некоторые исключения, которые должны быть подробными.

0 голосов
/ 13 декабря 2018

Вы можете сделать это, выполнив следующие действия:

string.constantize rescue false

Дополнительно

Если у вас есть строчная строка или имя таблицы для этого, его также можно преобразовать вимя класса с использованием метода classify следующим образом:

string.classify.constantize rescue false

Если у вас есть строка 'event_managers', она вернет класс EventManager

0 голосов
/ 13 декабря 2018

В чем ошибка?если это исключение, вы можете сделать что-то вроде:

the_class = your_string.constantize rescue false

rescue перехватывает исключение и возвращает false в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...