GitLabのコードリーディングをしてみた(中編)
【結論】
・「||=」は、nilガードと呼ばれるもので、
代入先がnilの時だけ代入され、既に値が入っている場合には、代入されない
【目次】
- 前回までの続き
- 4:issuables_collectionの定義元を探す
- 5:finderの定義元を探す
- 6:issuable_finder_forの定義元を探す
- 7:finder_optionsの定義元を探す
- 総括
- 《今日の学習進捗》
【本題】
前回までの続き
下記の記事の続きです。
ryoutaku-jo.hatenablog.com
4:issuables_collectionの定義元を探す
前回は、「@issuables」を定義している
「set_issuables_index」というメソッドを発見しました。
次は、「@issuables」に代入されている
「issuables_collection」の定義元を探します。
同じファイル内に「issuables_collection」というメソッドがありました。
メソッドには、「finder.execute.preload(preload_for_collection)」と記述されています。
5:finderの定義元を探す
「finder.execute.preload(preload_for_collection)」がどういった値かを探りますが、
メソッドチェーンされている場合は、先頭から定義を探します。
なので「finder」の定義元を探します。
これも同じファイル内に定義を確認できました。
メソッドは「@finder ||= issuable_finder_for(finder_type)」と定義されています。
なお、ここで出てくる「||=」は、nilガードと呼ばれるもので、
代入先がnilの時だけ代入され、既に値が入っている場合には、代入されないという記述です。
6:issuable_finder_forの定義元を探す
では次は「issuable_finder_for」の定義元を探します。
これも同じファイル内で発見できました。
「issuable_finder_for」の引数(finder_class)に対して
newアクションでモデルオブジェクトを生成しています。
そのモデルオブジェクトには(current_user, finder_options)という
プロパティが付与されます。
7:finder_optionsの定義元を探す
current_userは、現在ログイン中のユーザーという事はわかりますが、
finder_optionsがどういった値かは現時点で不明で、そちらを探します。
こちらも同じファイルにありました。
複数行に亘っているので、先頭から読み解いて行きます。
params[:state] = default_state if params[:state].blank?
まずこちらは、下記の様な処理になります。
1 「params[:state]」が「blank?」(空)だった場合
2「default_state」を、「params[:state] 」に代入する
3「params[:state]」が「blank?」(空)で無い場合は、ここでは何もしない
「default_state」がどういった値か不明なので、探します。
見つけました。「'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」の定義元を探ります。
論理和で繋がっているので、全てtureであれば、式はtureを返して、
いずれか一つでもfalseであれば、式はfalseを返すことになります。
では、この条件式がどうなっているのか
「set_sort_order_from_user_preference」
「set_sort_order_from_cookie」
「default_sort_order」を見て行きます。
総括
ちょっと長過ぎ・・・
また明日に持ち越します・・・
《今日の学習進捗》
チーム開発:22日目
各種リンクの設定を完了させる。
ローカル環境と本番環境で保存されているデータの種類の違いから、
NilClassエラーが発生し対応に苦慮する。
学習開始からの期間 :70日
今日までの合計時間:738h
一日あたりの平均学習時間:10.6h
今日までに到達すべき目標時間:639h
目標との解離:99h
「10,000時間」まで、
残り・・・「9262時間!」