我正在编写一个自定义包装器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 加载过程的一部分。
- 文件是明确的
require
d.如果一个文件是require
d、Ruby 会遍历你的加载路径中的整个路径列表,并找到你的文件所在的第一个情况require
d 在加载路径中。您可以通过检查 $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(使用前将#替换为@)