我的rails应用程序中的某些功能看起来更好,就好像它是一个单独的“模块”,应该通过require
访问。例如,假设它是计算斐波纳契数的函数。
该功能在rails应用程序上是独立的,可以在其他项目中重用,因此我不应该将它存储在应用程序控制器和模型附近。但是因为我不打算将它分成单独的项目,因此将它放到vendor
文件夹似乎不是正确的事情。
我应该把它放在哪里?
答案 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 开始的。 TLDR:app/lib
现在是惯例。
Rails 5 discourages you from using \lib
. 虽然不鼓励您使用 \lib,但只要将 \lib 添加到 Eagerloading 中,您仍然可以使用。
# config/application.rb
config.eager_load_paths << Rails.root.join('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