这可能是一个愚蠢的问题,但我是Ruby on Rails的新手,我可以使用一些指导。我想有一个帮助器/实用程序类,它执行一组网络操作并返回结果。我在哪里放这个课程,我该如何使用它。
我在app / modulename / helpers目录中创建了network_helper.rb。在我尝试做的时候在我的控制器中
myNetworkHelper = ModuleName::NetworkHelper.new
results = myNetworkHelper.getResults
我收到错误
undefined method `new' for MyModule::NetworkHelper:Module
我确信这只是对铁轨上红宝石如何工作的误解。我能澄清一下吗?
将它作为一个类而不是模块并将其放入库中会更好吗?我可以在库中添加子文件夹并让它们自动加载吗?
答案 0 :(得分:6)
像这样的小实用程序类通常会进入lib文件夹,但有些人更喜欢创建一个名为classes的文件夹。无论您选择哪个,请确保在config / application.rb中导入该文件夹,因为lib文件夹未自动加载:
config.autoload_paths += %W(#{config.root}/lib)
如果您希望使用可重用代码扩展某些模型而不是实用程序类,您可能还希望查看新的Rails 4关注文件夹,以鼓励您提取可重用模块:
答案 1 :(得分:3)
要使用new
,你调用它的东西必须是一个类,而不是一个模块。你正在使用一个模块。在module
中将class
更改为lib/utilities/network_utility.rb
。
答案 2 :(得分:1)
我目前无法验证这一点,但我相信您可以存储自定义模块和类的一个位置是lib
目录。或者,您应该能够以您指定的方式将它们存储在app
目录中,方法是将以下行添加到您的environment.rb中:
config.load_paths << File.join(Rails.root, "app", "modulename")
另外,请查看Yehuda Katz's answer,我认为这不仅可以更好地回答您的问题,还会包含一些与您的情况相关的非常有趣且有用的信息和概念。希望有所帮助!
答案 3 :(得分:0)
将类添加到app/lib
文件夹中,而不要添加到lib
文件夹中,以免更改自动加载路径!
说明:
可接受的答案建议将类添加到lib
中。
但是根据this discussion:
从Rails 3开始,lib文件夹不属于自动加载路径。
因此不建议在自动加载路径下添加lib
。请改用app/lib
。