小编jos*_*xls的帖子

查找模块中可用的类

我有一个模块MyModule.我动态地将类加载到其中.如何获取其命名空间中定义的类的列表?

例:

def load_plugins
  Dir.glob(File.dirname(__FILE__) + '/plugins/*.rb') do |f|
    MyModule.class_eval File.read(f)
  end

  # now how can I find the new classes I've loaded into MyModule?
end
Run Code Online (Sandbox Code Playgroud)

我应该说每个都f包含类似"类Foo;结束"的内容.

您也可以这样想:在Rails中,我如何以编程方式查找ActiveRecord模块中定义的所有类?

ruby metaprogramming

70
推荐指数
1
解决办法
3万
查看次数

environment.rb中设置的常量在开发模式下消失

了解rails缓存如何工作的人可以真正帮助我.这是代码,嵌套在Rails :: Initializer.run块中:

config.after_initialize do
  SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Run Code Online (Sandbox Code Playgroud)

现在,如果我跑步script/server并提出请求,一切都很花花公子.但是,在对我的Rails应用程序的第二个请求中,所有人都会因为一个单一化的常量错误而下地狱.在生产模式中,我可以成功地发出第二个请求,这意味着常量仍然存在.

我通过将上面的内容更改为:

config.after_initialize do
  require 'some_class' # in RAILS_ROOT/lib/some_class.rb
  SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end
Run Code Online (Sandbox Code Playgroud)

但现在这意味着每当我对some_class.rb进行更改时,我都必须重新启动服务器.有没有办法在环境文件中设置常量并让它们在开发模式下正常工作?为什么常量存在于第一个请求中,而不是以下请求?

更新:由于仅在启动Rails应用程序时读取environment.rb并且我希望在每个请求上重新加载我的lib文件和模型,因此我被迫将常量移动到some_class.rb文件中,如下所示:

if Rails.env.development?
  const_set 'SOME_CONST', 'SOME_DEVELOPMENT_VAL'
end
Run Code Online (Sandbox Code Playgroud)

在environment/production.rb中,我有旧的const_set代码.

更新:使用config.to_prepare的更好方法详述如下.

ruby ruby-on-rails

5
推荐指数
1
解决办法
1891
查看次数

标签 统计

ruby ×2

metaprogramming ×1

ruby-on-rails ×1