ruby-on-rails - .rb 文件中的 Ruby 类

标签 ruby-on-rails ruby

我喜欢从文件系统中读取 ruby​​ 文件并获取实际的 ruby​​ 类

Dir["app/controllers/admin/*.rb"].select{ |f|
    require File.expand_path(f)
    #how to turn 'f' into an actual class
}

我遇到的问题是 Kernel.load 或 require 都只用 bool 值响应。有没有办法获得实际的类(class)。我知道我可以使用文件路径来确定名称,但我不喜欢处理 namespace 。我怎样才能做到这一点?

最佳答案

首先,我要预先告诉您这可能是个坏主意。 Ruby 中的文件与类没有任何关系。一个文件可以定义一个类,也可以不定义类,也可以定义多个类,甚至可以根据任意条件动态定义类。此外,类定义可能分布在多个文件中,并且类可以在运行时动态更改。因此,至少可以说,可靠地确定文件中是否定义了一个类是一项艰巨的任务。

也就是说,这是您可能解决问题的一种方法。请注意,此解决方案非常棘手,并非在所有情况下都有效,如果您不小心,它可以多次加载同一文件:

module ClassLoader
  def self.load_classes(file)
    context = Module.new
    context.class_eval(File.read(file), file)
    context.constants.map{|constant| [constant, context.const_get(constant)]}.to_h
  end
end

用法:

./test_file.rb:

if rand < 0.5
  class A
  end
else
  class B
  end
end

class C
end

您的代码:

ClassLoader.load_classes('./test_file.rb') #=> {:A=>#<Module:0x9a3c128>::A, :C=>#<Module:0x9a3c128>::C}

或者,如果您使用的是 Rails,通常可以从文件名中推断出类名。这在某种程度上更可靠,因为它依赖于 Rails 为自动加载常量所做的相同约定:

Dir["app/controllers/admin/*.rb"].select{ |f|
    File.basename(f).camelize.constantize
}

关于ruby-on-rails - .rb 文件中的 Ruby 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370193/

相关文章:

ruby-on-rails - Heroku 中的 Twitter Bootstrap 字形

ruby-on-rails - 更新期间模型上的排序位置

javascript - Rails jquery 在任何情况下都无法加载

ruby - 在 Ruby 中插入包含双引号和冒号的 XML 字符串

ruby-on-rails - 检查 RSpec 是否返回类引用?

ruby-on-rails - 如何从 Rails 控制台生成 CSRF token ?

ruby-on-rails - 连接表的条件 - Rails

ruby-on-rails - 实现 ElasticSearch 后,Rails 应用程序在 Heroku 上崩溃

ruby-on-rails - 收不到广播

ruby-on-rails - 解析字符串以添加到 URL 编码的 URL