我正在重构一些加载到Rails控制台中的调试工具。调试工具曾经使用在代码中进行修改的全局变量,但是出于明显的原因,我想将其限制为名称空间,因此我将所有内容都放入类中,而使用类实例变量。
在某些时候,这些工具需要在#reload!
对象上定义的控制台中调用main
。将工具移至新类后,将无法再访问main
定义的方法。是否有一种从命名空间访问main
的好方法,以便我可以在其上调用#reload!
?
现在,我在TOPLEVEL_BINDING.receiver.reload!
上工作正常,但是我敢肯定有更好的方法。更好的解决方案也可能对Ruby命名空间具有启发性。
例如
class MyAwesomeTools
def reload!
# or whatever executes #reload! with main as the receiver
MAIN_NAMESACE.reload!
end
end
答案 0 :(得分:5)
除了TOPLEVEL_BINDING.receiver
之外,我还没有更整洁的选择来访问main
;确实,这不是人们经常需要去做的事情。
但是,要执行您描述的特定于Rails的操作,我建议跳过控制台帮助程序并直接调用“真实”重新加载方法:
Rails.application.reloader.reload!
那是all the helper method does(从Rails 5.0+开始;在那之前是spelt slightly differently)。