Rails /lib 模块和

2023-12-05

我正在编写一个自定义包装器open_flash_chart插入。它被放置在/lib并将其作为模块加载ApplicationController.

但是,我有类层次结构的问题或其他问题。

从我可以访问的任何控制器open_flash_chart功能为OpenFlashChart, Line etc.

然而,在一个班级里/lib模块,它不起作用!

有任何想法吗?


Rails 中加载文件的方式有两种:

  • 它在自动加载过程中注册,并且您引用与文件名相对应的常量。例如,如果您有app/controllers/pages_controller.rb并参考 PagesController,app/controllers/pages_controller.rb会自动加载。对于加载路径中的预设目录列表,会发生这种情况。这是 Rails 的一项功能,而不是正常 Ruby 加载过程的一部分。
  • 文件是明确的required.如果一个文件是required、Ruby 会遍历你的加载路径中的整个路径列表,并找到你的文件所在的第一个情况required 在加载路径中。您可以通过检查 $LOAD_PATH ($: 的别名)来查看整个加载路径。

Since lib在你的加载路径中,你有两个选择:要么使用与常量相同的名称来命名你的文件,这样当你引用相关常量时Rails会自动选择它们,或者明确要求模块。

我还注意到您可能对另一件事感到困惑。应用程序控制器是not系统中的根对象。观察:

module MyModule
  def im_awesome
    puts "#{self} is so awesome"
  end
end

class ApplicationController < ActionController::Base
  include MyModule
end

class AnotherClass
end

AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>

您需要将该模块包含到您想要使用它的任何类中。

class AnotherClass
  include MyModule
end

AnotherClass.new.im_awesome
# AnotherClass is so awesome

当然,为了能够首先包含该模块,您需要使其可用(使用上述任一技术)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails /lib 模块和 的相关文章

随机推荐