Ruby Engine 入門

1 引擎是什么?

引擎可以被認為是一個可以為其宿主提供函數功能的中間件。一個Rails應用可以被看作一個"超級給力"的引擎,因為Rails::Application類是繼承自 Rails::Engine的。

從某種意義上說,引擎和Rails應用幾乎可以說是雙胞胎,差別很小。通過本章節(jié)的學習,你會發(fā)現引擎和Rails應用的結構幾乎是一樣的。引擎和插件也是近親,擁有相同的lib目錄結構,并且都是使用rails plugin new命令生成。不同之處在于,一個引擎對于Rails來說是一個"發(fā)育完全的插件"(使用命令行生成引擎時會加--full選項)。在這里我們將使用幾乎包含--full選項所有特性的--mountable來代替。本章節(jié)中"發(fā)育完全的插件"和引擎是等價的。一個引擎可以是一個插件,但一個插件不能被看作是引擎。

我們將創(chuàng)建一個叫"blorgh"的引擎。這個引擎將為其宿主提供添加主題和主題評論等功能。剛出生的"blorgh"引擎也許會顯得孤單,不過用不了多久,我們將看到她和自己的小伙伴一起愉快的聊天。引擎也可以離開他的應用宿主獨立存在。這意味著一個應用可以通過一個路徑助手獲得一個articles_path方法,使用引擎也可以生成一個名為articles_path的方法,而且兩者不會沖突。同理,控制器,模型,數據庫表名都是屬于不同命名空間的。接下來我們來討論該如何實現。你心里須清楚Rails應用是老大,引擎是老大的小弟。一個Rails應用在他的地盤里面是老大,引擎的作用只是錦上添花??梢钥纯聪旅娴囊恍﹥?yōu)秀引擎項目,比如Devise ,一個為其宿主應用提供權限認證功能的引擎;Forem, 一個提供論壇功能的引擎;Spree,一個提供電子商務平臺功能的引擎。RefineryCMS, 一個 CMS 引擎 。

最后,大部分引擎開發(fā)工作離不開James Adam,Piotr Sarnacki 等Rails核心開發(fā)成員,以及很多默默無聞付出的人們。如果你見到他們,別忘了向他們致謝!

2 生成一個引擎

為了生成一個引擎,你必須將生成插件命令和適當的選項配合使用。比如你要生成"blorgh"應用 ,你需要一個"mountable"引擎。那么在命令行終端你就要敲下如下代碼:

 $ bin/rails plugin new blorgh --mountable

生成插件命令相關的幫助信息可以敲下面代碼得到:

$ bin/rails plugin --help

--mountable
選項告訴生成器你想創(chuàng)建一個"mountable",并且命名空間獨立的引擎。如果你用選項--full
的話,生成器幾乎會做一樣的操作。--full
選項告訴生成器你想創(chuàng)建一個引擎,包含如下結構:

  • 一個 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文件夾中創(chuàng)建一個簡單應用,在test/dummy/config/routes.rb中添加簡單應用的路徑。

mount Blorgh::Engine, at: "blorgh"

2.1 引擎探秘

未完待續(xù)

資料來源:http://guides.ruby-china.org/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容