我正在开发一个Rails引擎,所以我对现有引擎进行了一些研究。我注意到其中许多文件都在app
中,但也在lib
和vendor
中。
我很清楚,我应该将主机应用程序可以替换的任何代码放入app
文件夹中(例如,当拥有模型app/user.rb
时,主机应用程序可以轻松拥有自己的{ {1}}文件并使用此文件而不是引擎()。
但我不确定,当我必须将内容放入app/user.rb
,以及何时进入lib
?我想,在vendor
,我应该只放置其他开发人员或项目中的“外部”代码,我想在我的项目中使用,而在vendor
我放了我自己的额外库我我实际上在项目中工作。但是,例如,为什么WiceGrid会将内容放入其wice_grid/vendor/assets目录中?它看起来不像外部代码,而是仅为WiceGrid开发的代码,因此应该在lib
目录中?
更新
在尝试一下时,我注意到lib
文件夹中的所有代码在开发引擎时都没有重新加载(我想lib
目录的情况也是如此),所以我应该把他们进入vendor
内的文件夹,但究竟在哪里?
例如,我有一个文件app
,其中包含lib/iq_list_controller.rb
的一些类和实例方法,我将其混合到ApplicationController
中,如下所示:
engine.rb
我应该把这个文件放在哪里,以便Ruby正确找到它?
答案 0 :(得分:6)
关于开发重新加载问题,如果lib文件夹是文件的自然主页,则将其添加到Rails的加载路径中,例如:
module MyEngine
class Engine < ::Rails::Engine
config.autoload_paths << File.expand_path("../../lib", __FILE__)
end
end
关于供应商资产的具体情况,将引擎的资产放在应用程序/资产中似乎是合理的,主机Rails应用程序可以找到它们。
答案 1 :(得分:2)
如果您想要自动加载内容,请将它们放入/app
。否则我认为/lib
中的任何内容都应该是手动要求的。我一般认为自动加载lib文件夹是不好的做法。
答案 2 :(得分:1)
你的MVC的基本代码来自app文件夹。现在假设你有一个经常使用的通用方法/模块,所以为你的代码实现DRYness ...所有通用和常用工具都可以简单地放在lib文件夹中。
这是一个美丽的解释when to use lib和using lib folder in rails