<commit_before># Rails Engine 介绍

__特别要强调的翻译名词__

> host application ＝ 宿主。

> mount ＝ 安装

## 目录

- [1. Engine 是什么](#1-engine-是什么)
  - [1.1 Engine 开发简史](#11-engine-开发简史)
  - [1.2 Rails 2.x 使用 Engine](#12-rails-2x-使用-engine)
- [2. 产生 Engine](#2-产生-engine)
  - [2.1 Engine 里面有什么](#21-engine-里面有什么)
    - [2.1.1 重要的文件](#211-重要的文件)
    - [2.1.2 `app` 目录](#212-app-目录)
    - [2.1.3 `bin` 目录](#213-bin-目录)
    - [2.1.4 `test` 目录](#214-test-目录)
- [3. 给 Engine 加功能](#3-给-engine-加功能)
  - [3.1 建立 post resource](#31-建立-post-resource)
  - [3.2 产生 comment resource](#32-产生-comment-resource)
- [4. 安装至宿主](#4-安装至宿主)
  - [4.1 安装 Engine](#41-安装-engine)
  - [4.2 Engine setup](#42-engine-setup)
  - [4.3 使用宿主提供的类别](#43-使用宿主提供的类别)
    - [4.3.1 使用宿主提供的 model](#431-使用宿主提供的-model)
    - [4.3.2 使用宿主提供的 controller](#432-使用宿主提供的-controller)
  - [4.4 自定 `User` model](#44-自定-user-model)
    - [4.4.1 在宿主设定](#441-在宿主设定)
    - [4.4.2 配置 Engine](#442-配置-engine)
      - [4.4.2.1 Initalizer 例子：Devise `devise_for`](#4421-initalizer-例子：devise-devise_for)
      - [4.4.2.2 变更 Engine 默认的 ORM、模版引擎、测试框架](#4422-变更-engine-默认的-orm、模版引擎、测试框架)
      - [4.4.2.3 变更 Engine 的名称](#4423-变更-engine-的名称)
      - [4.4.2.4 添加 Middleware 到 Engine 的 Middleware stack](#4424-添加-middleware-到-engine-的-middleware-stack)
    - [4.4.3 撰写 Engine 的 Generator](#443-撰写-engine-的-generator)
- [5. 测试 Engine](#5-测试-engine)
  - [5.1 功能性测试](#51-功能性测试)
- [6. 增进 Engine 的功能](#6-增进-engine-的功能)
  - [6.1 覆写 Model 与 Controller](#61-覆写-model-与-controller)
  - [6.2 关于 Decorator 与加载代码](#62-关于-decorator-与加载代码)
  - [6.3 用 `Class#class_eval` 来实现 Decorator 设计模式](#63-用-class#class_eval-来实现-decorator-设计模式)
  - [6.4 用 `ActiveSupport::Concern` 来实现 Decorator 设计模式](#64-用-activesupportconcern-来实现-decorator-设计模式)
  - [6.5 覆写 views](#65-覆写-views)
  - [6.6 路由](#66-路由)
    - [6.6.1 路由优先权](#661-路由优先权)
    - [6.6.2 重新命名 Engine Routing Proxy 方法](#662-重新命名-engine-routing-proxy-方法)
  - [6.7 Assets](#67-assets)
  - [6.8 宿主用不到的 Assets 与预编译](#68-宿主用不到的-assets-与预编译)
  - [6.9 Engine 依赖的 Gem](#69-engine-依赖的-gem)
- [延伸阅读](#延伸阅读)

本篇介绍 「Rails Engine」。怎么优雅地把 Engine 挂到应用程序里。

读完本篇可能会学到.....

  * 什么是 Engine。

  * 如何产生 Engine。

  * 怎么给 Engine 加功能。

  * 怎么让 Engine 与应用程序结合。

  * 在应用程序里覆写 Engine 的功能。

# 1. Engine 是什么

Engine 可以想成是抽掉了某些功能的 Rails 应用程序： __微型的 Rails 应用程序__ 。可以安装到（mount）宿主，为宿主添加新功能。Rails 本身也是个 Engine，Rails 应用程序 `Rails::Application` 继承自 `Rails::Engine`，其实 Rails 不过就是个“强大的” Engine。

Rails 还有插件功能，插件跟 Engine 很像。两者都有 `lib` 目录结构，皆采用 `rails plugin new` 来产生 Engine 与插件。Engine 可以是插件；插件也可是 Engine。但还是不太一样，Engine 可以想成是“完整的插件”。

下面会用一个 `blorgh` Engine 的例子来讲解。这个 `blorgh` 给宿主提供了：新增文章（posts）、新增评论（comments），这两个功能。我们会先开发 Engine，再把 Engine 安装到应用程序。

假设路由里有 `posts_path` 这个 routing helper，宿主会提供这个功能、Engine 也会提供，这两者并不冲突。也就是说 Engine 可从宿主抽离出来。稍后会解释这是如何实现的。

__记住！宿主的优先权最高，Engine 不过给宿主提供新功能。__

以下皆是以 Rails Engine 实现的 RubyGems：

* [Devise](https://github.com/plataformatec/devise) 提供使用者验证功能。

* [Forem](https://github.com/radar/forem) 提供论坛功能。

* [Spree](https://github.com/spree/spree) 提供电子商务平台。

* [RefineryCMS](https://github.com/refinery/refinerycms) 内容管理系统。
<commit_msg>:taurus: Update guides/edge-translation/engines-zh_CN.md @ 2013-10-16 21:22:13 (Taipei Time)<commit_after># Rails Engine 介绍

__特别要强调的翻译名词__

> host application ＝ 宿主。

> mount ＝ 安装

本篇介绍 「Rails Engine」。怎么优雅地把 Engine 挂到应用程序里。

读完本篇可能会学到.....

  * 什么是 Engine。

  * 如何产生 Engine。

  * 怎么给 Engine 加功能。

  * 怎么让 Engine 与应用程序结合。

  * 在应用程序里覆写 Engine 的功能。

## 目录

- [1. Engine 是什么](#1-engine-是什么)
  - [1.1 Engine 开发简史](#11-engine-开发简史)
  - [1.2 Rails 2.x 使用 Engine](#12-rails-2x-使用-engine)
- [2. 产生 Engine](#2-产生-engine)
  - [2.1 Engine 里面有什么](#21-engine-里面有什么)
    - [2.1.1 重要的文件](#211-重要的文件)
    - [2.1.2 `app` 目录](#212-app-目录)
    - [2.1.3 `bin` 目录](#213-bin-目录)
    - [2.1.4 `test` 目录](#214-test-目录)
- [3. 给 Engine 加功能](#3-给-engine-加功能)
  - [3.1 建立 post resource](#31-建立-post-resource)
  - [3.2 产生 comment resource](#32-产生-comment-resource)
- [4. 安装至宿主](#4-安装至宿主)
  - [4.1 安装 Engine](#41-安装-engine)
  - [4.2 Engine setup](#42-engine-setup)
  - [4.3 使用宿主提供的类别](#43-使用宿主提供的类别)
    - [4.3.1 使用宿主提供的 model](#431-使用宿主提供的-model)
    - [4.3.2 使用宿主提供的 controller](#432-使用宿主提供的-controller)
  - [4.4 自定 `User` model](#44-自定-user-model)
    - [4.4.1 在宿主设定](#441-在宿主设定)
    - [4.4.2 配置 Engine](#442-配置-engine)
      - [4.4.2.1 Initalizer 例子：Devise `devise_for`](#4421-initalizer-例子：devise-devise_for)
      - [4.4.2.2 变更 Engine 默认的 ORM、模版引擎、测试框架](#4422-变更-engine-默认的-orm、模版引擎、测试框架)
      - [4.4.2.3 变更 Engine 的名称](#4423-变更-engine-的名称)
      - [4.4.2.4 添加 Middleware 到 Engine 的 Middleware stack](#4424-添加-middleware-到-engine-的-middleware-stack)
    - [4.4.3 撰写 Engine 的 Generator](#443-撰写-engine-的-generator)
- [5. 测试 Engine](#5-测试-engine)
  - [5.1 功能性测试](#51-功能性测试)
- [6. 增进 Engine 的功能](#6-增进-engine-的功能)
  - [6.1 覆写 Model 与 Controller](#61-覆写-model-与-controller)
  - [6.2 关于 Decorator 与加载代码](#62-关于-decorator-与加载代码)
  - [6.3 用 `Class#class_eval` 来实现 Decorator 设计模式](#63-用-class#class_eval-来实现-decorator-设计模式)
  - [6.4 用 `ActiveSupport::Concern` 来实现 Decorator 设计模式](#64-用-activesupportconcern-来实现-decorator-设计模式)
  - [6.5 覆写 views](#65-覆写-views)
  - [6.6 路由](#66-路由)
    - [6.6.1 路由优先权](#661-路由优先权)
    - [6.6.2 重新命名 Engine Routing Proxy 方法](#662-重新命名-engine-routing-proxy-方法)
  - [6.7 Assets](#67-assets)
  - [6.8 宿主用不到的 Assets 与预编译](#68-宿主用不到的-assets-与预编译)
  - [6.9 Engine 依赖的 Gem](#69-engine-依赖的-gem)
- [延伸阅读](#延伸阅读)

# 1. Engine 是什么

Engine 可以想成是抽掉了某些功能的 Rails 应用程序： __微型的 Rails 应用程序__ 。可以安装到（mount）宿主，为宿主添加新功能。Rails 本身也是个 Engine，Rails 应用程序 `Rails::Application` 继承自 `Rails::Engine`，其实 Rails 不过就是个“强大的” Engine。

Rails 还有插件功能，插件跟 Engine 很像。两者都有 `lib` 目录结构，皆采用 `rails plugin new` 来产生 Engine 与插件。Engine 可以是插件；插件也可是 Engine。但还是不太一样，Engine 可以想成是“完整的插件”。

下面会用一个 `blorgh` Engine 的例子来讲解。这个 `blorgh` 给宿主提供了：新增文章（posts）、新增评论（comments），这两个功能。我们会先开发 Engine，再把 Engine 安装到应用程序。

假设路由里有 `posts_path` 这个 routing helper，宿主会提供这个功能、Engine 也会提供，这两者并不冲突。也就是说 Engine 可从宿主抽离出来。稍后会解释这是如何实现的。

__记住！宿主的优先权最高，Engine 不过给宿主提供新功能。__

以下皆是以 Rails Engine 实现的 RubyGems：

* [Devise](https://github.com/plataformatec/devise) 提供使用者验证功能。

* [Forem](https://github.com/radar/forem) 提供论坛功能。

* [Spree](https://github.com/spree/spree) 提供电子商务平台。

* [RefineryCMS](https://github.com/refinery/refinerycms) 内容管理系统。

{'fraction_non_alphanumeric': 0.186307519640853, 'fraction_numerical': 0.06285072951739619, 'mean_word_length': 3.617320503330866, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 8, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4139445', 'n_tokens_mistral': 3901, 'n_tokens_neox': 4045, 'n_words': 490}