我应该在rails应用程序中将自己的“模块”放在哪里?

时间:2009-12-07 22:38:53

标签: ruby-on-rails

我的rails应用程序中的某些功能看起来更好,就好像它是一个单独的“模块”,应该通过require访问。例如,假设它是计算斐波纳契数的函数。

该功能在rails应用程序上是独立的,可以在其他项目中重用,因此我不应该将它存储在应用程序控制器和模型附近。但是因为我不打算将它分成单独的项目,因此将它放到vendor文件夹似乎不是正确的事情。

我应该把它放在哪里?

4 个答案:

答案 0 :(得分:6)

放置此类可重用代码的位置在lib目录中。但是,您不需要require任何内容,因为lib已经在加载路径中,并且它的内容将在初始化期间加载。

如果您需要扩展现有的类,首先定义您的模块,然后通过将其作为消息发送到您希望扩展的类来包含它,例如:

module MyExtensions
  def self.included base
    base.instance_eval do
      def my_new_method
        …
      end
    end
  end
end

ActiveRecord::Base.send :include, MyExtensions

答案 1 :(得分:2)

我经常将内容放在lib中,但事实证明lib下的任何内容都在加载路径中,并且根本不需要require d。

编辑:在Steve的评论之后,删除了有关必须要求文件的内容。另外,从我的一些代码中删除了一对夫妇:P

答案 2 :(得分:2)

RoR项目中有一个 lib 目录,非常适合这个目的 - 我在那里以“库”的形式放置了常见的代码。从将ActiveRecord类扩展到可重用的实用程序方法的任何东西。

答案 3 :(得分:1)

Rails 5+

答案是从 Rails 5 开始的。 TLDR:app/lib 现在是惯例。

  • 请注意,以上所有答案都是在 Rails 5 之前编写的。

\lib

Rails 5 discourages you from using \lib. 虽然不鼓励您使用 \lib,但只要将 \lib 添加到 Eagerloading 中,您仍然可以使用。

# config/application.rb
config.eager_load_paths << Rails.root.join('lib')

\app\lib

嵌套 lib off app 现在是一个常见的约定,因为 app 以外的任何目录都会自动预先加载。

参考

Rails guide - autoloading and eagerloading
Stackoverflow - confusing about autoload_paths vs eager_load_paths in rails 4
Stackoverflow - Why use app-lib instead of lib in rails