Help us understand the problem. What is going on with this article?

違うRailsアプリに同じふるまいを導入できるRails Engineのご紹介

More than 3 years have passed since last update.

これ何?

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 さんの記事、楽しみです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away