1 引擎是什么?
引擎可以被认为是一个可以为其宿主提供函数功能的中间件。一个Rails应用可以被看作一个"超级给力"的引擎,因为Rails::Application类是继承自 Rails::Engine的。
从某种意义上说,引擎和Rails应用几乎可以说是双胞胎,差别很小。通过本章节的学习,你会发现引擎和Rails应用的结构几乎是一样的。引擎和插件也是近亲,拥有相同的lib目录结构,并且都是使用rails plugin new命令生成。不同之处在于,一个引擎对于Rails来说是一个"发育完全的插件"(使用命令行生成引擎时会加--full选项)。在这里我们将使用几乎包含--full选项所有特性的--mountable来代替。本章节中"发育完全的插件"和引擎是等价的。一个引擎可以是一个插件,但一个插件不能被看作是引擎。
我们将创建一个叫"blorgh"的引擎。这个引擎将为其宿主提供添加主题和主题评论等功能。刚出生的"blorgh"引擎也许会显得孤单,不过用不了多久,我们将看到她和自己的小伙伴一起愉快的聊天。引擎也可以离开他的应用宿主独立存在。这意味着一个应用可以通过一个路径助手获得一个articles_path方法,使用引擎也可以生成一个名为articles_path的方法,而且两者不会冲突。同理,控制器,模型,数据库表名都是属于不同命名空间的。接下来我们来讨论该如何实现。你心里须清楚Rails应用是老大,引擎是老大的小弟。一个Rails应用在他的地盘里面是老大,引擎的作用只是锦上添花。可以看看下面的一些优秀引擎项目,比如Devise ,一个为其宿主应用提供权限认证功能的引擎;Forem, 一个提供论坛功能的引擎;Spree,一个提供电子商务平台功能的引擎。RefineryCMS, 一个 CMS 引擎 。
最后,大部分引擎开发工作离不开James Adam,Piotr Sarnacki 等Rails核心开发成员,以及很多默默无闻付出的人们。如果你见到他们,别忘了向他们致谢!
2 生成一个引擎
为了生成一个引擎,你必须将生成插件命令和适当的选项配合使用。比如你要生成"blorgh"应用 ,你需要一个"mountable"引擎。那么在命令行终端你就要敲下如下代码:
$ bin/rails plugin new blorgh --mountable
生成插件命令相关的帮助信息可以敲下面代码得到:
$ bin/rails plugin --help
--mountable
选项告诉生成器你想创建一个"mountable",并且命名空间独立的引擎。如果你用选项--full
的话,生成器几乎会做一样的操作。--full
选项告诉生成器你想创建一个引擎,包含如下结构:
- 一个 app目录树
- 一个 config/routes.rb文件:
Rails.application.routes.draw do
end
- 一个lib/blorgh/engine.rb文件,以及在一个标准的Rails应用文件目录的config/application.rb中的如下声明:
module Blorgh
class Engine < ::Rails::Engine
end
end
--mountable选项会比--full选项多做的事情有:
- 生成若干资源文件(application.js and application.css)
- 添加一个命名空间为ApplicationController的子集
- 添加一个命名空间为ApplicationHelper的子集
- 添加 一个引擎的布局视图模版
- 在config/routes.rb中声明独立的命名空间 ;
Blorgh::Engine.routes.draw do
end
在lib/blorgh/engine.rb中声明独立的命名空间:
module Blorgh
class Engine < ::Rails::Engine
isolate_namespace Blorgh
end
end
除此之外,--mountable选项告诉生成器在引擎内部的 test/dummy文件夹中创建一个简单应用,在test/dummy/config/routes.rb中添加简单应用的路径。
mount Blorgh::Engine, at: "blorgh"
2.1 引擎探秘
未完待续