これ何?
rails engineって言う仕組みの紹介と、それが便利に働くだろう場面、導入に際して私がハマったRails Engineの拡張方法について記載します。
※Rails Engineの作り方などはRails GuideのRails エンジン入門の方が詳しいので、そちらをどうぞ。
ただ、今回は私が使ったのがmountable engineであるためとくにmountable engineについて記載します。
Rails Engineのご紹介
Rails EngineはRails GuideのRails エンジン入門にも書いてあるように
機能的にはRaileアプリケーションとほぼ同等のものです。
modelも定義できますし、controller, helper, viewも通常のRailsアプリケーションでできることは一通りできると思って
問題ないです。
細かい機能はあまり、追っていないのですが、私が使ってきた場面では少なくとも通所のRailsアプリケーションと同様のことができてきました。
ただ、1点違うのがRails Engineは他のRailsアプリケーションにimport(Rails engine的な言葉を使うとmount)して使うことができるのです。
有名所としてはActive adminではないでしょうか?
Rails Engineが便利に働く場面
Rails Engineが便利に働く場面は結構限定されています。が、ピッタリハマれば結構生産性高く使うことができると思います。
私が思うRails Engineが便利に働くのは以下の2点が満たされたときだと思います。
- 同じふるまいを複数のサービスで実装する必要がある
- 複数のサービスはどれもRailsで記述されている
(ちなみに私は逆に上記の2点をうまく満たすために使えそうな手段はなんだろなとか、検討した際にちょうどピッタリ現れたので使ってみました。)
Rails Engineをうまく拡張するには?
Raile Engineを使って機能を作成したとしても、各アプリケーションで違うところがどうしても出てきてしまいます。
そういうときは、 engine.rb
に以下のような記載をしておくと、app/decorator
にdecoratorを定義するとそちらを読み取って、拡張してくすることが可能です。
私が使ったのはcontrollerでの拡張だったので、controllerの拡張方法を書いていきます。
Raile Engine側での設定例
module YourEngine
class Engine < ::Rails::Engine
isolate_namespace YourEngine
config.to_prepare do
# この部分が大事。この部分を書くことで *_decorator*.rb というファイル形式のファイルが
# mount先のRailsアプリケーションに有った場合は、そのファイルに記載してある内容で、
# rails engineを拡張できる
Dir.glob(Rails.root + "app/decorators/**/*_decorator*.rb").each do |c|
require_dependency(c)
end
end
end
end
Rails Engine側でのクラス定義例
module YourEngine
class YourController < ApplicationController
private
def hoge_method
raise 'hoge_methodを実装してね' # ここでmount先のappliction独自の処理を書かないと行けない箇所を吸収する
end
end
end
mount 先のRails Engineの拡張方法
拡張する際には通常のclass拡張で拡張していきます。
例えば、以下のような形です。
YourEngine::YourController.class_eval do
include YourEngineConcern # 例えばこんな形でConcernを使うこともできます。
private
def hoge_method
hoge
end
end
その他雑感
Raile Engineの情報を集めるに当たって、以下のサイトを良く見ていました。
ただ、単純な導入方法や使い方などは書いてあったのですが、それらを拡張する方法などはあまり、日本語のサイトには見当たらなかったです。
一方で、英語のサイトにはその辺りの情報がstack overflowに記載されてあり、とても参考になりました。
英語大事っすね。
終わりに
さて、どうでしたでしょうか。
私もこの3ヶ月くらいではじめてガッツリRails Engine触ったのですが結構良いなという印象です。また、Railsは拡張性高くて、優秀だわと思う日々です。また、価値あるプロダクトを最速で開発するためには、色々な新しいことを試し続けていく必要があるんだなと思った最近でもあります。
この記事を元に、おんなじ振る舞いを違うRailsアプリに導入したいんだけど、どうしたらいいんだーと言う人の一助になれば幸いです。
freeeではこのように新しいことを試す必要がある開発で溢れています。いろんな課題をEngineer力で解決したい腕力系のエンジニアを大募集しています。
次はfreeeには社会的に生きるために入社したと言っている『30歳 無職 エンジニア』で検索1位の @hiraguri です。
人間の根源的な欲求を満たすためにエンジニアなった @hiraguri さんの記事、楽しみです。