我有一个目录/ 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) }
为我工作。
答案 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'
),这将为您提供camelize
和constantize
方法。