Rails引擎:何时将代码放入应用程序,何时放入lib,以及何时放入供应商文件夹?

时间:2012-10-04 09:44:33

标签: ruby-on-rails ruby rails-engines

我正在开发一个Rails引擎,所以我对现有引擎进行了一些研究。我注意到其中许多文件都在app中,但也在libvendor中。

我很清楚,我应该将主机应用程序可以替换的任何代码放入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正确找到它?

3 个答案:

答案 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 libusing lib folder in rails