わからないこと調べてみた | rails commit log流し読みを読んでみた

f:id:sktktk1230:20180726121250p:plain

1. 概要

@y_yagiさんのrails commit log流し読みを読んでいてわからなかったこと調べてみました

2. 読んだエントリ

y-yagi.hatenablog.com

3. わからなかったこと

  1. PRの中の処理に書かれていたrack_app < Rails::Engine とは何だろう?

4. PRを読んでみる

対象のPR

github.com

1. どんな修正内容?

Make engine check more explicit
actionpack/lib/action_dispatch/routing/endpoint.rbの修正です。
Routing::Endpoint#engine?メソッドでappがengineかどうかをチェックするのに、routesメソッドが定義されているかどうかで判定していたのを、appかRails::Engineの子クラスかどうかで判定するよう修正しています。
engineではないがroutesメソッドが定義されているケースがある(e.g. Grape APIのendpoint)為。
引用:rails commit log流し読み(2018/03/25)

2. 対象のPRの内容

f:id:sktktk1230:20180327113224p:plain

5. PR読んでてわからない部分調べてみた

1. rack_app < Rails::Engine とは何だろう?

記述箇所は該当PRの下記部分になります

def engine?
  rack_app.is_a?(Class) && rack_app < Rails::Engine
end

特定のクラスを継承しているかチェックしている処理とのことでした

※ 調べてみたら@semind氏のQiitaに記事がありました

qiita.com

実際の挙動を確認してみました
ChildクラスがParentクラスを継承している場合

f:id:sktktk1230:20180327113240p:plain

継承関係にあったので、戻り値がtrueになっています
つまり、 def engine? の処理は

rack_app.is_a?(Class) && rack_app < Rails::Engine

rack_app がクラスであり、かつ Rails::Engine を継承しているかを判定している処理でした