# 技術面談対策 ☆技術面接 - リクエスト/レスポンスを Railsアプリから画面表示されるまでの流れおしえて - ログイン機能を クッキー セッション使ってせつめいして >・HTTPリクエストはステートレスなので状態を保持できない ・セッションとは:サーバー側で保存される小さな情報、または領域 ・Cookieとは:ブラウザ側で保存される小さな情報、または領域 ログインとは:ユーザーにセッションとCookieの情報を持たせて、前後の情報間で繋がりを持たせた状態のこと ### Railsの流れ ブラウザからサーバーにリクエストが渡り、railsがリクエストを解析、routingを参照して処理するコントローラとアクションを決定、コントローラでDBへの参照が必要ならActiveRecordを介してやり取りし、DBから値を取得。Viewに値を埋め込んでHTMLを表示 ### トランザクション いくつかの処理を一まとめとして扱い、うち一つでも処理が失敗した場合に全ての処理をなかったことにする。 ### コールバックってなに? →コールバック関数・・・関数のなかに関数があるやつ https://wa3.i-3-i.info/word12295.html →Railsガイドのコールバック https://railsguides.jp/active_record_callbacks.html イベントを補足できるもの?たとえばcreate前とか後とか あらゆるタイミングを指定できるメソッド 何かのアクションを起こしたときに呼ばれる関数 (before_actionやafter_createなど) ### ライフサイクル 生まれてから死ぬまでの流れ。循環。 (newして、updateして、destroyするまで) ### deleteとdestroyのちがいは? https://railsguides.jp/association_basics.html#dependent **delete**・・・最小限。SQLを直接打ってるようなもの、指定のデータ1つのみを削除 **destroy**・・・Activerecordを介して削除する、関連付けられたモデルも削除 ### Rubyのselfについて説明して下さい・どんなときに使いますか・・・ Rubyのselfとは、オブジェクトそのものを指しています https://techacademy.jp/magazine/18706 谷さん> rubyの場合はクラス自身を指す、 ### Rubyのselfはどんなときに使うかを説明してください クラスメソッドの定義や呼び出しではselfを使う クラス内ではselfを用いて現在のクラスを参照する、つまり、あるクラスメソッドから(訳注: 同じクラス内の)別のクラスメソッドを呼び出すときに必須となる インスタンスからクラスメソッドを呼び出す場合はself.class.methodという呼び出し方法が必須となる https://techracho.bpsinc.jp/hachi8833/2020_05_13/91211#6 https://docs.google.com/spreadsheets/d/1Zl7nqbs7CaelaWkL888GZnUtFaLX7-twg3ilQ7LwxAQ/edit?usp=sharing ### Rubyのゲッターとセッターについて説明してください Rubyではゲッター(getter)を用いてインスタンス変数を参照でき、セッター(setter)を用いてインスタンス変数に値を設定(書き込む)できます。 ゲッターメソッドやセッターメソッドは、以下のように手動で定義することもできます ```ruby= class Book def initialize(title, price) @title = title; @price = price end #↓ゲッター (attr_reader) def title @title end #↓セッター (attr_writer)    def title=(val) @title = val    end #セッターがあることで、代入できる。 book.title = "test" #ゲッターがあることで、参照できる。 p book.title #"test" ``` ### Q15: Railsの「イニシャライザ」について説明してください イニシャライザには、アプリの起動時にのみ実行する設定ロジックを置きます。つまり、イニシャライザの内容を変更した場合はRailsサーバーの再起動が必要です。イニシャライザは/config/initializers/ディレクトリの下に置かれます。 Railsガイド Railsは、フレームワークの読み込みとすべてのgemの読み込みが完了してから、イニシャライザの読み込みを開始します。 ※自分のイニシャライザが、他のすべてのgemのイニシャライザが実行された後で実行されるという保証はありません。つまり、そうしたgemに依存する初期化コードはconfig.after_initilizeブロックに配置すべきです。 https://railsguides.jp/configuring.html#%E3%82%A4%E3%83%8B%E3%82%B7%E3%83%A3%E3%83%A9%E3%82%A4%E3%82%B6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86 ☆肉さん知識☆ _1〜_9 など、メソッドに使用することができない 簡潔に! アプリ起動時に読み込まれる設定ファイル! もっというと、フレームワーク(プログラムの雛形)とgemが読み込まれた後に読み込まれる! gemの依存関係にあるファイルを入れておいてしまうと、読み込まれる順番が保証されないので、ファイルに番号つけるか 同じファイルに書いて書く順で制御する **谷さん > 初期設定のファイルを置くところ。** #### SQL書ける?(頭の中でSQLのイメージできる?) 谷さん > 簡単なのは書けますがgroup_byといった複雑なものは調べながらであれば書けます。(select, inner_joinあたりはスラスラ書けるようにすること「SQLbolt というサイトが良い」) ### length、size、count メソッドの違い countはSQLが発行される 配列(Arrayクラス)でのlengthとsizeはエイリアスだが、 業務入ってから詳しく知りたいです たにさん>配列ではエイリアスだけどアクティブレコードの世界では別物と考えたほうが・・・ ```ruby= def size loaded? ? @records.length : count(:all) end ``` lengthとcountの出し分けをしているのが**size** ```sql= [9] pry(#<PlayListsController>)> users = User.all User Load (2.6ms) SELECT `users`.* FROM `users` ↳ app/controllers/play_lists_controller.rb:6:in ... [13] pry(#<PlayListsController>)> users.length => 5 [14] pry(#<PlayListsController>)> users.count (14.7ms) SELECT COUNT(*) FROM `users` ↳ (pry):3:in `index' => 5 ``` 変数usersにUser.Allを入れて(厳密には`.load`を付け足す) **users.count**と**users.length**の場合 - countを使うとSQLを発行する ので、SQLのクエリが発生するかしないかでパフォーマンス(N+1問題)が変わる ## デザインパターンがいようくらいこたえられるように **Q9: Railsでどんなデザインパターンを使ったことがありますか?** https://applis.io/posts/rails-design-patterns#rails%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E4%B8%80%E8%A6%A7 ・**フォームオブジェクト**・・・複数テーブルに値を保存したいときに使用するパターン。ファットモデルを避けるため、別クラスを作ってそこで新たに定義する。 作った定義はコントローラとビュー(form_with)で使用できる。 ・**Decoratorオブジェクト**・・・ビューの修飾メソッドを書きたいとき。ファットモデルを避けるため、別クラスに。 [タワラさんnote](https://note.com/kentarotawara/n/n0c1ff2060cf7) 「viewに表示したいメソッドを追加したけれど、モデルに書くと肥大化してしまう」という声です。 この問題をうまいこと対処するために生まれたのが、decoratorパターンです。 ※Railsのヘルパー・・・ビューをシンプルに書くためのモジュール。railsで用意してあるもの。  〜〜pathとか https://fresopiya.com/2019/06/26/helper/ #### モデルとヘルパーの使い分け ![](https://i.imgur.com/9cu7FR8.png) https://jiro8899.hatenablog.com/entry/2020/02/16/235117 モデルに依存する(userのフルネームの定義)・・・デコレータ! モデルに依存しない(~path)・・・ヘルパー! >デコレーターはモデルに依存し、機能(メソッド)を追加したりできる。decoraterはdecoraterオブジェクトでラッピングしたオブジェクトでのみ使えるが、Helperはモデルに依存せず機能(メソッド)を追加したりできる、ロジックをviewに記述するとviewファイルが肥大化し、可読性が低下してしまう。共通のviewのロジックはHelperに書き、helperは制限なくどこでも呼び出せる。 --- ・**Delivelyオブジェクト**・・・通知に関するロジックをカプセル化する責務をもちます。ActionMailerで利用する ・**Interactorオブジェクト**・・・Serviceオブジェクトと似てる。Serviceオブジェクトは定義があいまいで、特定のルールをもちません。Interactorオブジェクトはルール決めなどがきちんとされたもの - **View Componentオブジェクト** Rails6.1から「サードパーティー製のコンポーネントフレームワークのサポート」が行われるようです 頻出するビューを部品化してパーシャルのように使える。ビューに書くコードを減らせる。gemを使うのが一般的だと思います。。 [ViewComponentを試した人のブログ](https://webuilder240.com/blogs/d72517f0-0b58-4f76-ae46-954e89a4a921) --- - !がついてるときと付いていないときの挙動の違いを説明して(エクスクラメーションマーク) 例外処理かどうか https://qiita.com/ozin/items/5968971c9d2b3ab0a84d create!、save! → レコードの作成・保存に失敗 → 例外を発生させる (エラー画面) create、save → レコードの作成・保存に失敗 → nilを返す nilだと失敗したことがわからないから失敗を捕捉するため!つける 単語の前につくとnot演算子で否定の意味がある ex. != 5(5じゃない)  !true(trueじゃない) https://docs.ruby-lang.org/ja/latest/doc/symref.html [だいそんさんの理解度チェック講座より](https://hackmd.io/coZGaARgSwW15i9vV_tmqQ#save%E3%81%A8save%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E3%81%A9%E3%81%86%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%BE%E3%81%99%E3%81%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%82%89%E3%80%8Cfalse%E3%80%8D-%E3%81%8C%E8%BF%94%E3%82%8A%E3%80%81save%E3%81%AF%E3%80%8C%E4%BE%8B%E5%A4%96%E3%80%8D%E3%81%8C%E8%BF%94%E3%82%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%83%B3%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%80%81save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%AA%E3%81%84%E3%81%AF%E3%81%9A%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82) [説明部分](https://youtu.be/B-H9cJiW02M?t=1041) --- - オブジェクト指向とはなんですか 「モノ」を組み立てるように表現して、コンピュータに動作をさせる。それぞれの「モノ」に意味を与え、「モノができること(役割)」を作っていく考え方。https://www.sejuku.net/blog/5973 オブジェクト指向とは、一連の処理に使う「変数」や「関数」をひとまとめにして、再利用できるように名前をつけてテンプレ化しておこう!という考え方です。 https://blog.senseshare.jp/object-orientation.html 車→操作方法を知っていれば仕組みを全て知っていなくてもあつかえる。 全部隈なく知らなくても扱える考え方。 モノの役割をパーツ化して手軽に使えるようにする考え方。大人数の開発に効率的。 スマホ LINE https://www.rstone-jp.com/column/200831no2/ >🍖< 上の記事を見ながら思ったこと >> オブジェクト指向なら、「車のプログラム」を作成したエンジニアだけがその中身を理解していればよく、他のエンジニアは「Aボタンを押すと走り、Bボタンを押すと止まる」ことだけ理解しておけば済むわけです。 >> >> > Aボタンというコンポーネントがあり、Bボタンというコンポーネントがあってそれらを組み合わせて1つの「モノ」を作っていく。🤔 他にデータ指向、手続き型などがある --- ### Gitについて  [コンフリクト解消 Qiita](https://qiita.com/crarrry/items/c5964512e21e383b73da) **・コンフリクトおこしたときどうする?**・・・差分を確認して正しい方を残す(不要な方は削除する)、その後コミットしてpush ```sql= <<<<<<< HEAD # 作業ブランチでの変更内容 ・・・ ======= # develop(マージしたブランチ)での変更内容 ・・・ >>>>>>> develop ``` ```sql= <<<<<<< HEAD <?php class Util_Message { const B_MESSAGE_1 = 'bbranchが追加したメッセージ 1個目。'; const B_MESSAGE_2 = 'bbranchが追加したメッセージ 2個目。'; ======= <?php class Util_Message { const A_MESSAGE_1 = 'abranchが追加したメッセージ 1個目。'; const A_MESSAGE_2 = 'abranchが追加したメッセージ 2個目。'; >>>>>>> develop } ``` ↓活かす分だけ記載 ```sql= const B_MESSAGE_1 = 'bbranchが追加したメッセージ 1個目。'; const B_MESSAGE_2 = 'bbranchが追加したメッセージ 2個目。'; ``` --- **・別ブランチに書いちゃったときどうする?**・・・ `$ git stash`で変更差分を退避し、チェックアウトして本来のブランチに移動してstash pop(復元&リストからも消える) 複数stashしている場合は stash listで確認しながら stash apply 番号 で戻す(この場合リストからは消えないので要drop) [git stash Qiita](https://qiita.com/fukajun/items/41288806e4733cb9c342) https://kray.jp/blog/git-pull-rebase/ --- ### Active Jobってなに? サイドキック - 寺井さんの記事↓ https://dev.icare.jpn.com/dev_cat/sidekiq/