Ruby Engine 入门

2016-12-23  本文已影响130人  spaceship

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
选项告诉生成器你想创建一个引擎,包含如下结构:

 Rails.application.routes.draw do 
 end
module Blorgh
    class Engine < ::Rails::Engine
    end
end

--mountable选项会比--full选项多做的事情有:

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 引擎探秘

未完待续

资料来源:http://guides.ruby-china.org/

上一篇下一篇

猜你喜欢

热点阅读