14

这可能是一个愚蠢的问题,但我是 Ruby on Rails 的新手,我可以使用一些指导。我想要一个助手/实用程序类来执行一组网络操作并返回结果。我在哪里放置该类以及如何使用它。

我在我的 app/modulename/helpers 目录中创建了 network_helper.rb。当我尝试做时在我的控制器中

  myNetworkHelper = ModuleName::NetworkHelper.new
  results = myNetworkHelper.getResults

我收到一个错误

 undefined method `new' for MyModule::NetworkHelper:Module

我敢肯定这只是对 ruby​​ on rails 工作原理的误解。我可以澄清一下吗?

将其设为类而不是模块并将其放入库中会更好吗?我可以在库中添加子文件夹并自动加载它们吗?

4

4 回答 4

7

库或类

像这样的小实用程序类通常放在 lib 文件夹中,尽管有些人更喜欢创建一个名为 classes 的文件夹。无论您选择哪个,请确保将文件夹导入 config/application.rb,因为 lib 文件夹不会自动加载:

config.autoload_paths += %W(#{config.root}/lib)

关注点

如果您想使用可重用代码扩展您的一些模型而不是实用程序类,您可能还希望查看鼓励您提取可重用模块的新 Rails 4 关注文件夹:

请参阅:如何在 Rails 4 中使用关注点

于 2013-07-15T09:45:40.400 回答
3

要使用new,你调用它的东西必须是一个类,而不是一个模块。你正在使用一个模块。更改module为. class_lib/utilities/network_utility.rb

于 2013-03-10T04:22:33.983 回答
1

我目前无法验证这一点,但我相信您可以存储自定义模块和类的一个地方是lib目录。或者,您应该能够通过将以app下行添加到您的 environment.rb 中指定的方式将它们存储在目录中:

config.load_paths << File.join(Rails.root, "app", "modulename")

另外,查看Yehuda Katz 的回答,我认为它不仅可以更好地回答您的问题,而且还包含一些与您的情况相关的非常有趣和有用的信息和概念。希望有帮助!

于 2013-03-10T03:54:51.320 回答
0

将您的类添加到app/lib文件夹而不是lib,这样您就不会更改自动加载路径!

说明:

接受的答案建议将类添加到lib.

但根据这个讨论

自 Rails 3 以来,lib 文件夹不属于自动加载路径。

所以不鼓励lib在自动加载路径下添加。改为使用app/lib

于 2020-05-24T11:41:41.693 回答