# 【第3週】パRails輪読会🚂 \(2023\-09\-04\~ 2023\-09\-08\) ###### tags: `パRails🚂` - [開催概要](https://hackmd.io/4A_8ahJtQNi5hz713N5Y7w?view) - [パRails輪読会 ノートまとめ]() - サンプルコード・正誤表:[サポートページ:パーフェクトRuby on Rails【増補改訂版】:|技術評論社](https://gihyo.jp/book/2020/978-4-297-11462-6/support) - **サンプルコードをダウンロードしただけでは、すぐに`rails s`できない可能性が高い**です。 以下のページに環境構築の手順をまとめたので、ドライバーをやってくださるという方は、こちらに沿って環境構築をお願いします🙏 ⏩ [環境構築の手順 2022年版](https://hackmd.io/y7qb2BRMT2Wd4tAtKYObcQ) ⏩ [環境構築の手順 2023年版](https://hackmd.io/3_lnn8_QRD6wEjwFbWcBzQ) 💁‍♀️ [更新の手順 2章編](https://hackmd.io/pZAmF2EjSmyQ38lUtJ_CqA) ## 目次 [TOC] ------ ## 2023\-9\-4(月) ### ファシリ @sadanora ### ドライバー @motohiro-mm ### 読んだところ 第二章の68p、「バリデーションと「!」付きのメソッド」から 71pの途中。 ### 次回 71pの「コールバックポイントの整理」から。🚂 ### 学んだこと・感想 - @sharoa - `ActiveRecord`には保存操作を伴うメソッドがいくつか存在していて、これらのメソッドには「!」を伴うメソッドがついとなって存在する。例)`create`↔️`create!`、`save`↔️`save!`など。 - 有無の違いはきちんと覚えておきたい。 - Rails組み込みのバリデーションには様々な内容のものがあるが、少しずつ覚えていきたい。 - Acteive Recordでは、特定の処理に引っ掛けて別の処理を呼ぶことをコールバックという。上手に活かすことでメリットが生まれるらしい。 - @shodan - 組み込みのバリデーションを行うときは`validates`、独自のカスタムバリデーションをしたいときは`validate`メソッドにブロックを渡す - 保存操作を伴うメソッドの「!」は「バリデーション失敗時」に例外を起こす。 - 「コールバック」はレコードの保存・更新・削除・バリデーションなどのタイミングの前後で行いたい処理を設定できる。 - @sadanora - ActiveRecordの「!」がついたメソッド - !あり → バリデーション失敗時に例外を起こさない - !なし → バリデーション失敗時に例外「ActiveRecord::RecordInvalid」を発生させる - コールバックによって、レコードの作成や更新、削除の前後で行いたい処理を宣言的に書ける - @hiromisugie - ActiveRecordのメソッドは、以下の違いがあるので、使い分けできるようにする - `careate!`、`save!`、`upodate!`など`!`のつくものはバリデーション失敗時に例外が起こる - `careate`、`save`、`upodate`など`!`のつかないものは例外を起こさない - rails c再起動しないといけないタイミングに気をつける(今回で言うとバリデーションを設定した時) - `before_validation`などのコールバックは、レコードを作成・保存する一連の流れの間に処理を挟むことができて便利。 - git操作、「いつもの操作」以外全然わかってないのでちゃんと使えるようになりたい! - @motohiro-mm - バリデーション失敗時に、「!」なしメソッドは例外を起こさず、「!」ありメソッドは例外を起こす - コールバックは前処理、後処理を書くもの - 今日は初ドライバーで緊張しましたが、みなさんが優しく教えてくださったのでなんとか出来ました🙇‍♀️💦ありがとうございます! - ドライバーになることもあるから、自分でファイルをいじるときはきちんとブランチをわけて行うように気をつけます。みなさんの時間をとってしまってすみませんでした。 - 打つの遅いですが、またやりたいです! - @moegi29 - ActiveRecordで「!」を付けると例外が起こる。 - validateブロックを使ってカスタムできる - 使ったことないバリデーションいろいろ知れた。numericalityは数値であること、オプション、偶数かなどを検査する - ActiveRecordでは一連の流れの間のさまざまな箇所で任意の処理を差し込める。 - 特定の処理にひっかけて別の処理を呼ぶことをコールバックという。 ------ ## 2023\-9\-5(火) ### ファシリ @moegi29 ### ドライバー @sadanora ### 読んだところ 71pの「コールバックポイントの整理」から 77pのコラムまで。 ### 次回 77p 2-3 コントローラーの役割から。🚂 ### 学んだこと・感想 - @sharoa - コールバックポイントがいっぱいあって覚えるのが大変だな、と思いました。 - また、そのコールバックも`delete`や`update_*`などには実行されないらしいので気を付けたいとおもいます。 - `ActiveRecord::Enum`の項で色々と動かしていただき確認できたのが楽しかったです。 - `ActiveRecord::Enum`はrails4.1から導入されたものでその前は`enumerize`というものだったらしい。 - 簡単に扱うなら前者でよさそうだが、複雑な使い方をする場合は後者を検討したほうがよさそう。 - @odentakashi - modelを通らずにSQLのみが発行されるメソッドがあるので関連付けを行っている時は注意。 - enum型使ったことないけど、とても便利そう - enum型は他のテーブルとの関連付けはどうするのか気になった。 - @hiromisugie - コールバックポイントは沢山ある。 - コールバックは`:if`や`:unless`で起動条件を指定することができる。 - `destroy`はAvtiveRecordでモデルを介してDBを操作するけど、`delete`は直接SQLを実行してデータを削除する(ので、コールバックが効かない) - Enum型(列挙型)を利用すると便利(あんまりわかっていない) - Enumは、述語メソッドで状態を問い合わせできる - Enumは、`!` 付きのメソッドを使うとそのenum値へ更新する(DBにも反映される) - Enum機能の高機能版として`enumerize`というgemがある - 今日のTips: `git log --graph --oneline`でlogが綺麗に見られる! - @shodan - コールバックにも`:if`や`:unless`で特定条件の際にコールバックをかけるようなオプションがある。 - レコードの保存関係のメソッドの中には、コールバックは実行されないものがある。 - `delete`や`update_*`は普通に使いそうなので注意。 - DBには数値で保存しつつ、そのカラムにプログラム上の別名を与えることができる`enum`型という値の管理方法がある。 - @sadanora - モデルに対してenumで定義したカラム名の複数形メソッドをクラスメソッドとして呼び出してenumの定義を確認できる。 - Book.sales_statuses - Enumを導入するとScopeが利用できるようになる - 該当するenum名で検索するscopeと該当enum名を含まない検索の2種ついが追加される - `sales_status`なら、`sales_status`と`not_sales_status`の2つが追加される。 - enumめちゃ便利そうだけど知らないうちにscopeが使えるようになったりしてるのでちゃんと動きを把握して使いたいなと思いました。 - @moegi29 - :if :unlessというオプションで特定の条件を満たした場合、起動するコールバックを実装できる。 - destoroyメソッドはアクティブレコード(モデル)を介してデータを削除する、deleteはSQLを実行してデータを削除する - Enumで定義したものに対して`?`で問い合わせ、`!`で更新、 .sales_statusと書くと文字列の値を取得できる。 - git log --graph --oneline エイリアス - @motohiro-mm - コールバックは`:if`と`:unless`で起動の条件を指定できる - コールバックはActiveRecord(つまりModel)に設定するものなので、ActiveRecordを介さずにレコード操作するメソッドには実行されないので注意する(deleteなど) - destroyはActiveRecordを介し、deleteはActiveRecordを介さずにSQLを直接実行してデータを削除する - enum(イーナム)は数値のカラムに対してプログラム上で扱える別名を与えるもの - ?で状態を問い合わせられる、! 更新できる - `git log --graph --oneline`で見やすい! - 次回は寝過ごさないようにします。。 ------ ## 2023\-9\-6(水) ### ファシリ @hiromisugie ### ドライバー @motohiro-mm ### 読んだところ 77p 2-3 コントローラーの役割から 84p 2-3-2の終わりまで PR: https://github.com/KMZ0209/Perfect_Ruby_on_Rails_Ch2/pull/9 ### 次回 84p 2-3-3 ルーティングとリソースから🚂 ### 学んだこと・感想 - @hiromisugie - 注釈にあった`curl`のコマンド、destroyアクションをターミナルで実行する方法ということでメンターさんに教えてもらったことがある記憶があるけど完全に忘れていたので、試してみたい - `before_action :set_hoge`があって後ろの方に`set_hoge`メソッドが定義してあるというやつ、よく見る!再確認できてよかった - aroundの使い所がよくわからない。どっちにしろ`around-before`と`around-after`というかんじで処理自体の前か後になるのだから、`before_action`と`after_action`で代用できそうだけど、見かけたら使い所のコツを学んでいきたい - CSRF対策はフムフム…という感じだったけど、あえて独自で設定しないほうが良さそうかなと思った - ログインをするための画面でログイン必須だと先に進めないので、フックのスキップを使ってそれを回避できる - @shodan - `/books/:id`へのルーティングの`:id`のパラメータ部分は、コントローラに渡ってきた`params`オブジェクトの`:id`キーと連携している。 - パラメータ以外にもPOSTで送信されたデータやクエリストリングスもこの`params`から取得できる。 - アクションの前後に差し込む処理をアクション外で定義できる -> フックという機能。 - 親コントローラから継承したフックをskipすることもできる。 - @sadanora - `/books/1`の1の部分は`routes.rb`の`:id`と対応しparamsオブジェクトを経由して取得することができる。 - POSTで送信したパラメータやURLのクエリストリングなども取得できる。 - コントローラーはリクエストヘッダやURLの拡張子などでレスポンスのフォーマットを判別する。 - フックによってアクション前後に処理を差し込むことができる。 - `skip_before_action`などによってskipできる。 - aroundフックはyieldでアクション側に処理を戻してあげる必要がある。 - ブートキャンプアプリでaround使ってないかなと思って検索してみたものの、使ってないっぽい。 - @cellotak  - リクエストデータとして送られてくる値はparamsオブジェクトを通して取得できる - 例えば、`/books/1`の「1」の部分はroutes.rbの[:id]と記述した部分に対応するので、paramsオブジェクトを通して取得できる - フックはアクションの前後に処理を差し込む事ができる仕組みで、フィルターと呼ぶこともできる - 複数のアクションで共通の処理を1つのメソッドへ切り出す時に利用することができる - aroundフックはアクションの前後で実行するので、before相当の処理のあとyieldを使ってアクション側に処理を戻す必要がある - 親クラスで定義したフックは子クラスのコントローラでも有効なので、子クラス側でフックをスキップしたいときはskip_before_actionなどのクラスメソッドを使う - HTTPのプラクティスのダミーページは多分CSRFが無効化されている気がする - @moegi29 - フックはアクションの前後に処理を差し込めるコールバックのようなもの。複数のアクションで共通の処理を1つのメソッドへ切り出すときにフックを利用できる。 - メソッド名を指定する以外にブロックを使ってフックを定義することもできる。 - CSRF対策機能は、攻撃者が用意したWebページから送られてくる偽造リクエストを不正なリクエストとして扱うための機能のこと。ふむふむ - @motohiro-mm - ActionController::Baseはコントローラの基底クラスで、Applicationコントローラが継承している - フックのオプション:onlyは指定アクションのみ、exceptは指定したアクション以外 - フックはブロックを用いて指定もできる - フックのスキップは、フックのアクション名にskipをつける - 以前自力で、ぱRailsをすすめたときにエラーが続いたのは、このあたりの入れなくて良い例えのコードをがっつり書いたままにしたからだなぁと、今日初めて気づけました。 - @odentakashi - around_actionというものの存在を初めて知りました。どんな場面で使うのか気になりました。 - デバッグとかに使うのかな? -----