【问题标题】:Where should my non-model/non-controller code live?我的非模型/非控制器代码应该放在哪里?
【发布时间】:2010-09-22 01:24:23
【问题描述】:

我编写了一个遵循常规目录结构(模型中的模型代码,控制器中的控制器代码)的 Rails 应用程序。

但我现在正在开发一项新功能,为此我编写了一些(我称之为)“服务”代码。
新功能是将一些数据导入系统,目前是两个类进行导入,但可以扩展到更多。

我不相信新代码属于模型,因为它没有对任何对象进行建模(它也不直接与任何单个对象相关。 我当然不认为它属于控制器,因为它不是表示逻辑。

所以,我创建了一个“app/services”目录并将其放入其中。 我还创建了一个“test/services”目录,我在其中放置了我的测试。

我认为一切都很好,但是当我运行“rake:test”或“autotest”时,我的新服务测试没有运行。
现在我希望有一种方法可以让 rake 捡起它们,但这是我做错了什么的警告标志吗?
代码是否应该存在其他地方,或者我是否以某种方式没有以“Rails 方式”做事?

通常每当我遇到这样的问题之前,我通常会发现 Rails 已经有了解决方案,但我不知道惯例。 这是其中一种情况吗?

【问题讨论】:

    标签: ruby-on-rails ruby rake


    【解决方案1】:

    这就是“lib”文件夹的用途。

    lib文件夹在自动查找的路径中,所以你可以拥有

    class MyFoo
    end
    

    lib/my_foo.rb 中,然后只需调用

    MyFoo.new
    

    无需require 'my_foo',即可从控制器加载代码

    【讨论】:

    • 您的测试仍然可以驻留在应用根目录下的 /tests 文件夹中。你只需要在测试的顶部做一个'require '。因此,如果您的文件是 lib 目录中的“service.rb”,则只需在测试中“要求服务”即可。
    • 谢谢,现在已经把它们移到了 lib 下的一个目录中(我也把它们做成了一个模块)。 Rake 仍然没有接受我的测试,但我猜这是另一个问题。
    【解决方案2】:

    ./lib 绝对是个好去处。

    另一个放置它的地方是在 config 下的 initializers 目录中,这取决于你在做什么。你也可以考虑把整个东西做成一个插件,但如果它是少量的功能,它可能不值得。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2012-03-05
      • 2012-04-23
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多