Rails::Engineとはなんなのか

最近やっとコードを読むという習慣をつけよう、という意識が自分の中で芽生えるようになってきて、それでRailsのgemとか読んでるときにRails::Engineというのが毎回出てくる。

そしてその意味すらわからんおれやばいな。。ってなったのでここでちゃんと調べてまとめておこうと思った。

Rails::Engineとは

Rails::ApplicationクラスはRails::Engineから機能を継承している。

つまりRails::Engineで多くの外部アプリ(gem)で実装した機能が取り込まれ(これがエンジンだ!!)このエンジンをかけることによってRailsのApplicationが動きだす...!!という仕組みなのかな。なんかかっこいい。

ということでApplicationとEngineは実は内部ではほとんど違いがない。 利点もある!切り分けるとホストアプリケーション(Railsで作ったアプリ、というかRails::Application?)と名前空間がかぶらない!!(ヘルパーとか)

疎結合を実現するためにRailsでがんばってる部分もあるんだなぁ。ふむふむ。。

エンジンの基本クラスはapp/lib/app/以下の例えばengine.rbとかで定義されてる。deviseだとdevise/lib/devise/rails.rbでした。

https://github.com/plataformatec/devise/blob/master/lib/devise/rails.rb

Turbolinksだとturbolinks/lib/turbolinks.rbだ。このパス自体は割と柔軟に変更できるのか。ただlibの中に入れるというのは決まっているみたい。

https://github.com/rails/turbolinks/blob/master/lib/turbolinks.rb

rubygemsというのは、実はこれを使ってるってわけ!

Rails pluginとして実装されたエンジンとしてのRailsアプリをホストアプリケーションで取り込む、その簡単な仕組みがgemってわけなんだ!(gemってなんかライブラリ引っ張ってこれるパッケージ管理ツールぐらいにしか思ってなかったやばい。)

Railsエンジンでアプリを作る、というのは下にすごく丁寧にまとめていただいてます。内容はブログだし公式のRailsGuidesに所感を加えているというような印象で、これってかなりありがたい。

使いやすくなった Rails 3.1 の Engine - passingloopの日記

自分的に注目すべきところは、

  • $ rails plugin new engine_name --mountableってやると、engineのアプリ構成を勝手に作ってくれて、見た目ほぼRailsアプリっぽいけど、実は違う
  • 最初からgemを作るような構成になっている
  • isolate_namespace()で名前空間を分ける仕組み

気合さえあれば基本的にrails本体のrails.rbを読むのがよさそう

https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb

Special Thanks

  • 公式

ここにお世話になりまくった

Rails エンジン入門 — Rails ガイド