Вызов класса пространства имен с Rails constantize inflector - PullRequest
4 голосов
/ 21 марта 2012

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

SomeThing::MyClass.new()

Но я вызываю его из аргументов в задаче rake, поэтому он появляется в виде строки:

task :blah, [:my_class_name] => :environment do |t, args|
  class_name = args[:my_class_name].camelize.constantize
  puts class_name
end

Очевидно, что если я вызову задачу rake следующим образом:

rake blah[my_class]

Моя задача вернется:

MyClass # <= Actual ruby object

Но как я могу запустить еевнутри пространства имен, связанного перед другим методом, например:

SomeThing::MyClass.new()

Из строки, предоставленной в качестве ввода?

1 Ответ

9 голосов
/ 21 марта 2012

Вы можете упростить свою жизнь, просто используя строку имени класса и выполнив

Something.const_get(args[:my_class_name]).new

Вот упрощенная версия (обычный IRB, без Rails):

module Something ; end
class Something::MyClass ; end
my_class_name = "MyClass"
Something.const_get(my_class_name).new 
#=> #<Something::MyClass:0x007fa8c4122dd8>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...