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
- 公式
ここにお世話になりまくった