GitLabのコードリーディングをしてみた(中編)

f:id:ryoutaku_jo:20190216192413p:plain

【結論】
・「||=」は、nilガードと呼ばれるもので、
 代入先がnilの時だけ代入され、既に値が入っている場合には、代入されない


【目次】


【本題】

前回までの続き

下記の記事の続きです。
ryoutaku-jo.hatenablog.com

4:issuables_collectionの定義元を探す

f:id:ryoutaku_jo:20190215235921p:plain

前回は、「@issuables」を定義している
「set_issuables_index」というメソッドを発見しました。

次は、「@issuables」に代入されている
「issuables_collection」の定義元を探します。

f:id:ryoutaku_jo:20190216201825p:plain

同じファイル内に「issuables_collection」というメソッドがありました。
メソッドには、「finder.execute.preload(preload_for_collection)」と記述されています。

5:finderの定義元を探す

「finder.execute.preload(preload_for_collection)」がどういった値かを探りますが、
メソッドチェーンされている場合は、先頭から定義を探します。

なので「finder」の定義元を探します。

f:id:ryoutaku_jo:20190216202238p:plain

これも同じファイル内に定義を確認できました。
メソッドは「@finder ||= issuable_finder_for(finder_type)」と定義されています。

なお、ここで出てくる「||=」は、nilガードと呼ばれるもので、
代入先がnilの時だけ代入され、既に値が入っている場合には、代入されないという記述です。

6:issuable_finder_forの定義元を探す

では次は「issuable_finder_for」の定義元を探します。

f:id:ryoutaku_jo:20190216202621p:plain

これも同じファイル内で発見できました。

「issuable_finder_for」の引数(finder_class)に対して
newアクションでモデルオブジェクトを生成しています。

そのモデルオブジェクトには(current_user, finder_options)という
プロパティが付与されます。

7:finder_optionsの定義元を探す

current_userは、現在ログイン中のユーザーという事はわかりますが、
finder_optionsがどういった値かは現時点で不明で、そちらを探します。

f:id:ryoutaku_jo:20190216203113p:plain

こちらも同じファイルにありました。
複数行に亘っているので、先頭から読み解いて行きます。

params[:state] = default_state if params[:state].blank?

まずこちらは、下記の様な処理になります。
1 「params[:state]」が「blank?」(空)だった場合
2「default_state」を、「params[:state] 」に代入する
3「params[:state]」が「blank?」(空)で無い場合は、ここでは何もしない

「default_state」がどういった値か不明なので、探します。

f:id:ryoutaku_jo:20190216203553p:plain

見つけました。「'opened'」という文字列だけの様です。

では「finder_options」の読み解きに戻ります。

    options = {
      scope: params[:scope],
      state: params[:state],
      sort: set_sort_order
    }

「options」という変数に、
{scope: params[:scope],state: params[:state],sort: set_sort_order}
を代入しています。

Railsでは、リクエスト情報をひとまとめにして、
params[:パラメータ名]という形式で取得
できます。

リクエスト情報とは、リンクをクリックしたり、
フォームのサブミットをクリックする事で送信されるので、
このparamsの値がどういったものか知るには、ビュー側を見る必要がある・・・

・・・のでしょうが・・・・いくらビューを見回しても、特定できず・・・
直接キーワードで検索しても、関係ない物ばかりヒットしてしまい、
今の私のレベルでは、これ以上を読み解くことができませんでした・・・

という訳で、paramsの部分は飛ばします!

sort: set_sort_order

「set_sort_order」の定義元を探ります。

f:id:ryoutaku_jo:20190217013858p:plain

論理和で繋がっているので、全てtureであれば、式はtureを返して、
いずれか一つでもfalseであれば、式はfalseを返すことになります。

では、この条件式がどうなっているのか
「set_sort_order_from_user_preference」
「set_sort_order_from_cookie
「default_sort_order」を見て行きます。

f:id:ryoutaku_jo:20190217100712p:plain

f:id:ryoutaku_jo:20190217015341p:plain

f:id:ryoutaku_jo:20190217015355p:plain

総括

ちょっと長過ぎ・・・
また明日に持ち越します・・・

《今日の学習進捗》

チーム開発:22日目
各種リンクの設定を完了させる。
ローカル環境と本番環境で保存されているデータの種類の違いから、
NilClassエラーが発生し対応に苦慮する。

学習開始からの期間 :70日
今日までの合計時間:738h
一日あたりの平均学習時間:10.6h
今日までに到達すべき目標時間:639h
目標との解離:99h
「10,000時間」まで、

残り・・・「9262時間!」