【问题标题】:Utility Classes In Ruby on RailsRuby on Rails 中的实用程序类
【发布时间】:2013-02-25 10:51:48
【问题描述】:

这可能是一个愚蠢的问题,但我是 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 工作原理的误解。我可以澄清一下吗?

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

【问题讨论】:

  • 如果你打算在上面使用new,它需要是一个类。
  • 我对此很满意。添加了文件lib/utilities/network_utility.rb 我收到需要该文件的错误。该 require 语句如何查找 lib 文件?另外,如果您将此作为答案,我会接受。
  • 完成了。谢谢!

标签: ruby ruby-on-rails-3


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    要使用new,调用它的对象必须是类,而不是模块。你正在使用一个模块。在lib/utilities/network_utility.rb 中将module 更改为class

    【讨论】:

    • 如何以红宝石友好的方式将其包含在我的控制器中?
    • @btate:使用require_relative。如果您的主文件位于bin/main.rb(随便),请使用require_relative '../lib/utilities/network_utility.rb'
    • 严格来说,你可以在一个模块上调用new,你只需要定义它。虽然它可能不会做你想要的。 new 没有什么特别之处。
    • @AndrewMarshall:是的。但是,一旦你这样做了,你只会迷惑人们。
    【解决方案3】:

    库或类

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

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

    担忧

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

    见:How to use concerns in Rails 4

    【讨论】:

      【解决方案4】:

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

      解释:

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

      但是根据this discussion

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 2017-12-09
        • 1970-01-01
        相关资源
        最近更新 更多