如何从特定目录自动调用Ruby脚本中的类

时间:2017-03-23 21:07:05

标签: ruby

我有一个目录/ lib,我存储* .rb文件。它们中的每一个都包含一个具有单个类方法remove_user()的类。

如何让主脚本自动覆盖这些文件并在所有文件上调用相同的方法?我希望以后只在该目录中插入文件,而无需以任何方式修改主脚本。

我知道如何require基于“Best way to require all files from a directory in ruby?”的目录中的所有文件,但我不太确定如何从这里“循环”调用类。

更新

我尝试了“How do I create automatically a instance of every class in a directory?

中建议的代码
files = Dir.glob("lib/*.rb")

def load_modules(class_files)
  puts class_files
  before = ObjectSpace.each_object(Class).to_a
  class_files.each {|file| require_relative file }
  after = ObjectSpace.each_object(Class).to_a
  (after - before).each {|klass| klass.new.delete_user('myemail@mail.com', 'Audit', 'Test')}

  load_modules(files)
end

产生错误:

/Users/apinchuk/RubymineProjects/autoaudit/init.rb:16:in `new': can't create instance of singleton class (TypeError)
from /Users/RubymineProjects/autoaudit/init.rb:16:in `block in load_modules'
from /Users/RubymineProjects/autoaudit/init.rb:16:in `each'
from /Users/RubymineProjects/autoaudit/init.rb:16:in `load_modules'
from /Users/RubymineProjects/autoaudit/init.rb:20:in `<top (required)>'
from -e:1:in `load'
from -e:1:in `<main>'

我无法找到关于此错误的任何内容。

create_uat_robot.rb的结构如下:

class CreateUatRobot
  def self.delete_user(email, first_name, last_name)
    ...
  end
end

该文件的名称为create_uat_robot.rb

尝试@moveson建议如下:

files = Dir.glob("lib/*.rb")
files.each {|file| require_relative file }

klasses = Dir["lib/*.rb"].map {|file| File.basename(file, '.rb').camelize.constantize}
klasses.each { |klass| klass.delete_user(arguments) }

为我工作。

1 个答案:

答案 0 :(得分:1)

首先,您需要创建一个类名数组:

>> klasses = Dir["lib/*.rb"].map {|file| File.basename(file, '.rb').camelize.constantize }

然后你可以依次调用你的方法:

>> klasses.each { |klass| klass.remove_user }

如果您不使用Rails,则可以要求ActiveSupport的字符串扩展方法(require 'active_support/core_ext/string'),这将为您提供camelizeconstantize方法。