# rails engine

## Engines & plugins

Common: \[1]`lib` dir, \[2]generated using `rails plugin new`

Difference: \[1]engine is considered a "full plugin" by Rails, \[2]Engines can be isolated from host apps.

## Generating an engine <a href="#generating-an-engine" id="generating-an-engine"></a>

`rails plugin new blorgh --mountable`

`--full`: \[1] `app`dir tree, \[2]`config/routes.rb`, \[3] `lib/your_engine/engine.rb`(similar to `config/application.rb`)

`--mountable`: `--full` + \[1]Asset manifest files (`application.js` and `application.css`), \[2]namespaced `ApplicationController, ApplicationHelper, layout view template, config/routes.rb` , \[3] Namespace to`lib/your_engine/engine.rb`, \[4] mount the engine inside the dummy test

## Base class for the engine

Base class = `lib/blorgh/engine.rb`

```
module Blorgh
  class Engine < ::Rails::Engine # inheriting from the Rails::Engine class, this will let rails know how to deal with this.
    isolate_namespace Blorgh
  end
end
```

`isolated_namespace`Isolates the controllers, models, routes, etc into own namespace, away from similar components inside the app. Without this, the engine's helpers would be included in an app's controllers.

Create Article model/controller: `YourEngine::Article`, `your`*`engine`*`article`, `YourEngine::ArticlesController`,

### When Constants aren't Missed <a href="#when-constants-aren-t-missed" id="when-constants-aren-t-missed"></a>

```
# app/models/flight_model.rb
class FlightModel
end

# The above will be overridden by each airplane
# app/models/bell_x1/flight_model.rb
module BellX1
  class FlightModel < FlightModel
  end
end
```

```
# app/models/bell_x1/aircraft.rb
module BellX1
  class Aircraft
    def initialize
      @flight_model = FlightModel.new # which FlightModel??
    end
  end
end
```

Ambiguous can be prevent by

```
# 1. explicit definition!!
module BellX1
  class Plane
    def flight_model
      @flight_model ||= BellX1::FlightModel.new
    end
  end
end

# 2. require_dependency
require_dependency 'bell_x1/flight_model'
module BellX1
  class Plane
    def flight_model
      @flight_model ||= FlightModel.new
    end
  end
end
```

## Require in host's gem file

In host app's gemfile: `gem 'your_engine', path: 'engines/your_engine'`

This will require `lib/your_engine.rb`.

This file requires `lib/your_engine/engine.rb`, and defines a base module called `YourEngine`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://huang-jason.gitbook.io/ruby-rails-syntax/rails-engine.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
