# 【第3週】パRails輪読会 \(2022\-08\-08\~ 2022\-08\-12\)
###### tags: `パRails(2回目)`
- [開催概要](https://hackmd.io/rOcLR0riRqmOgEF0_Ssm0A?both)
- [パRails輪読会 ノートまとめ](https://hackmd.io/5emISRvRRXapmakSiHnFJg?both)
- 2020年開催のノート:[パRails 輪読会ノートまとめ \- HackMD](https://hackmd.io/JC8zzjn_T-GaIh-71clcKQ)
## パRailsのサンプルコード・正誤表
- [サポートページ:パーフェクトRuby on Rails【増補改訂版】:|技術評論社](https://gihyo.jp/book/2020/978-4-297-11462-6/support)
- [パRails 環境構築の手順](https://hackmd.io/y7qb2BRMT2Wd4tAtKYObcQ)
## 目次
[TOC]
------
## 2022\-08\-08(月)
### 連絡事項や確認・相談
- 8/11(木)は祝日(山の日)なので、お休みです
### タイムキーパー
- @Saki
### ドライバー
- @tomonari
### 読んだところ
- P.79 [2-3-1途中の「ビューの決定と表示」]〜
### 次回
- P.84 [コラム RailsにおけるCSRF対策]〜
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- hikaru(代読お願いします〜)
- curlコマンドで色々操作できるんですね〜。普段画面上でぽちぽちやってる操作も単なるリクエストに過ぎないってことなのかな?と思いました
- `around_action`はメソッドの中で処理をアクションに戻さないといけないということらしいけど、`around_action`でしか使えないメソッドができてしまうってこと?
- しかもそれがメソッドの中身を見ないとわからないので、間違って他のところで使ってしまう...とかやらかしそう
- @fuwa
- curlコマンド怖
- `around_action` 初めて知りました。正直使い方がいまいちわからないけれど、きっと便利な部分もあるのでしょう
- フックの定義はメソッドだけでなくブロックでもできる
- @Saki
- 最初フックとかコールバックって出てきて怖いと思ったが、ちゃんと理解すればそんなに難しいものではなかった
- 2-3-2で言っているのは、
- showアクションとdeleteアクションで、`@book = Book.find(params[:id])`という同じ処理を書いている
- この共通の処理を`set_book`メソッドに切り出す
- これを、`before_action`等を使うことで、コールバック処理=今回言うと、destroyアクションが走る前にset_bookメソッドを実行させる、ということができる
- `before_action`などのことをフックと言うの知らなかった
- `around_action`
- Actionの前後両方で実行させる
- `yield`に、`around_action`で登録したアクションが入るイメージ
- P.82のコード
- around_actionでアクションしてして
- curlでDELETEできてしまうのこわい!!
- @haruguchi
- Railsはデフォルトでcsrf_meta_tagsというヘルパーによってcsrf対策が行われている
- curlとwgetの違いはよくわかってないけど、リクエスト飛ばせるからもちろんDELETEもできる
- フックは何かの処理の前後に処理を挟むという意味
- ブロックで定義すると匿名関数ならぬ匿名フックができる validateと同じだった
- Client for URLs :pray:
- https://curl.se/docs/faq.html#What_is_cURL
- LEF
- curlの怖さを改めて分かりました。
- around_actionを初めて知りました!yieldの使い方もよく分からなかったので参考になりました。
- tomonariさんドライバーありがとうございました。もし自分がやっていたらもっとワチャワチャして時間が掛かっていたと思います。
- ガラムマサラもテンパってます
- 質問なのですが、もしドライバーになったら、輪読会が終わった後に変更したファイルをpushする形でしょうか?
- @napple29
- `around_action`はアクションの前後に処理を差し込める
- curlコマンド怖すぎる
- https://qiita.com/yasuhiroki/items/a569d3371a66e365316f
- POSTとかもできるからデータの書き換えもできるのか、、、すごい
- @paru871
- aroundフックは、Action前後の処理を指定できる。
- Actionの指定は`yield`で指定する。
- aroundフックは前後でセットだろうか?どちらかだけでもOKか調べてみたいです。
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @tomonari
- 初めてのドライバーでしたが、ご助言いただいたり、お待ちいただいたりしてなんとか終えることができました!
- ナイストライ!:+1::+1:
- ありがとうございました!
- 皆様ありがとうございました!
- @Saki ドライバーありがとうございました!!初めてですのにイレギュラーな操作で大変だったかと思います🙏お疲れ様でした!
- @fuwa
- 今日は1ヶ月ぶりにジョギングをしました。びっくりするほど体力が落ちていて残念です。。。
- LEF
- 夕食はかぼちゃの天ぷらを食べます!🎃
- :urayama:
- 高級キーボード欲しいな~と思いつつ2000円のキーボード使ってます。⌨
- @haruguchi
- 久しぶりに、序盤の方から参加できました。急いで仕事を終わらせた
- ガラムマサラさん元気ですか?
- 天気が悪く膝が痛いです(病院のフードコートで聞いてます):hand:🦿:knees::muzukasi:
- :hiza::elbow::foot::hand::head: :sune: :ashi: :ohiza: :legg no knee:
- :knee:膝出てこなかった。。🦵←あった!
- :poultry_leg: 違う。。
- @napple29
- tomonariさん、初めてのドライバーとはつゆ知らず、色々試していただいてありがとうございました🥺😂
- curl試せて勉強になった
- 月曜日やる気出ない
- @paru871
- tomonariさんのドライバーが流暢で素晴らしかったです!ありがとうございました。
- curlで試したの面白かったです。ワイワイ楽しい!
- 上に書いた疑問、それならbeforeとかafterのフックでいいのかな??
- @Saki
- 司会やドライバーは慣れてる人が大抵やってるのでハードル高く感じるかもですけど、お気軽にやってくださると嬉しいです!スムーズにやらなきゃいけないとかは全然ないです😃
## 2022\-08\-09(火)
### 連絡事項や確認・相談
### タイムキーパー
- @ガラムマサラ
### ドライバー
- @saki
### 読んだところ
- P.84 [コラム RailsにおけるCSRF対策]〜
### 次回
- P.90 [2-3-5 StrongParameters]〜
### 自由に使う共有スペース
ドライバーした時のコード載せておきます!
- ちょっと複雑なルーティング
```ruby
resources :publishers do
resources :books #publishers/:publisher_id/books/:book_id
member do
get 'detail'#publishers/:publisher_id/detail
end
collection do
get 'search'#publishers/search
end
end
```
- resource(単数系)
```ruby!
# resourceだとルーティングが単数系になる
resource :profile, only: %i{show edit update} #onlyで作るアクション指定できる
```
### 各自の疑問点や気づき、学んだこと
- @napple29
- LoginFailedクラスで例外を複数用意したいときはどうするんだろう?(いい時間なので自分で調べます…)
- collectionとかmemberの指定方法は知らなかったので大変勉強になりました
- 一人のユーザから見てアプリ上に一つしかないものはresource(単数)を使う
- だからindexがないんだあ~と発見!
- @maimu_x2x
- Sinatraの課題で存在しないページへのアクセス時に404エラーページを出すようにしたのですが、自分で例外定義の方法がわからずStandardErrorとして処理しました・・・。Rrailsでrescue_fromで自分で例外が定義できるのは勉強になりました!
- @garammasala29
- ルーティングの`collection`と`member`は復習
- ルーティングの切り分けの話https://zenn.dev/shima_zu/articles/divide_rails_routes
- `rescue_from`で例外クラスを指定し、`with`オプションでアクションを指定
- パRailsあっさり大事なことたくさん書いてある
- @Saki
- `rescue_from`
- 自分で例外クラスを作って、実行させる処理は書いたことがないので難しかった!
- `skip_before_action`
- 例えばApplicationControllerに、`before_action :require_login` を書くと、アプリの全てのコントローラのアクションの実行前に`require_login`が発動する
- 発動させたくないアクションがある場合、スキップさせたいコントローラに`skip_bedore_action :require_login(メソッド), only: [:new, :create](アクション指定)`
- resourcesは↑の[自由に使う共有スペース]
- @paru871
- `resorces`を使うと、一般的なCRUD操作全てのルーティングが定義できる。。。すごい!便利!
- 拡張として`member`や`collection`を使えば基本のアクション以外の任意のルーティングを設定することができる。
- 1つしかリソースが存在しない場合は、`resource`を使えばよい!
- 例外処理、いつも赤い画面がでるとギョッとするので仲良くなりたい。
- @haruguchi
- ステータスコード神経衰弱とかみんなでやりたいですね。覚えられそう
- ルーティングは大体いつも忘れるから都度ググってる 同じやつでも書き方が複数あるのが、、、
- `collection do ~ end` ` on: :collection`みたいな
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @maimu_x2x
- 1日参加しなかっただけで、ちょっとついていけない感がありました(涙)
- もうすぐRailsのプラクティスに入るため可能な限り輪読会参加を継続したいと思います!
- @napple29
- 木曜は祝日、木曜は祝日、木曜は、、、、、、、
- 🍵
- @garammasala29
- 森塚さんありがとうございました!またいろいろ教えてください!
- haruguchiさん、ポーカーしたいなぁ…🤔
- もうちょっと待って!
- @haruguchi
- ふーがさんいないので宣伝しておきます
- https://blog.agile.esm.co.jp/entry/start-accepting-ise-ebi-curry
- 夏っぽいことがしたい
- 線香花火がしたい
- スイカ割りがしたい
- あと何がある?
- 花火大会
- <s>蕎麦打ち</s> 流しそうめん
- 陰の人間だからもう思い浮かばなかった。。。。
- ルービックキューブ
- 着衣水泳
- ほたる??
- バナナボート
- @Saki
- 自作サービス作らないといけないけど、夏休みっぽいことがしたい! とりあえず花火を買って、かき氷を食べに行きたい
- パRails、さらっと書いてあるけど難易度高い😂 :wakaru:
- 365連休...😇
- @paru871
- 例外処理、あまり慣れないところだったので森塚さんがいらっしゃってくれて本当にありがたかったです!ありがとうございました!!
- 今日の曜日もわからなくなる。
## 2022\-08\-10(水)
### 連絡事項や確認・相談
- 明日は祝日なのでお休みです!
### タイムキーパー
### ドライバー
### 読んだところ
- P.90 [2-3-5 StrongParameters]〜
### 次回
- P.99 [2-4-2途中 layoutテンプレート]〜
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- @napple29
- 部分テンプレートのファイル名は`_`始まり
- 他の部分は心ここにあらずだったのでひとりで読んでおきます、、、、
- LEF
- renderを省略できる、は今まで意識していなかったので勉強になりました!
- renderでインスタンス変数などを渡す場合に`locals`で明示的に渡したほうがいいよ、とレビューで教えていただいたのを思い出しました(それまでは暗黙的?に渡していました)。
- StrongParametersについても今までなんとなくで理解していたので、今回改めて学習できて良かったです。
- privateの中に`require`と`permit`を使って書く!
- @Saki
- StrongParamter
- これを設定して、ユーザーからきたリクエストの中で、許可したパラメーターだけを受け付けるようにしないと、管理者権限で入れてしまったりする。
- bootcampで検索すると色々出てきて面白い:[Search · params\.require](https://github.com/fjordllc/bootcamp/search?q=params.require)
- アプリを使う時、自分でパラメータを追加してリクエストを送ることがないので、いろんなリクエストが来ることを想定して気をつけないといけないなと思った
- レンダリングの仕組み
- 普段`render :show`などを書かず、`rails g controller`すると自動的にcontrollerと対応したviewができるので意識していなかった
- 仕組みとしては、`render :show`でviewテンプレートを呼び出せる
- 省略可能で、書かないと自動的に`render アクション名`と解釈される。なのでshowアクションで省略すると自動的にshowのviewと解釈する
- @haruguchi
- Mass Assignmentって一括でデータの更新とかができるやつだったんだ
- テンプレートの探索順でハマった経験がある
- @maimu_x2x
- StrongParameramterについてちゃんと覚えておきたいと思います。これに加えてDBやRails側で受け取った値のチェックをする感じなのかな。
- @fuwa
- StrongParameter、こないだ使ってみて便利だなーと思っていました。ちゃんと設定しないと管理者権限使い放題ですね。
- アクション名とテンプレート名が同じならrenderを省略できるの忘れていました
- @paru871
- 2-3-5 StrongParameters
- 意図しない属性の変更を一般ユーザーに許してしまうことを避けるために使う
- MassAsignmentで利用しても良い属性を許可リストとして`permit`で定義しておく
- 2-4-1 レンダリングまでの流れ
- `render` `redirect_to`などを使って表示するものを指示する
- 上記2つにどちらにも`:status`オプションを渡してステータスコードを指定できる
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @tomonari
- タイムキーパーも初挑戦できて、いい経験になりました!
- 結構緊張しますね
- 初司会ありがとうございました!🙏✨✨
- 超スムーズでした!初めてとは思えないです!!
- @maimu_x2x
- 部分テンプレートの活用など覚えて使いこなしたい内容がたくさんあって、自分用のまとめノートちゃんと作ろうと思います!
- @fuwa
- ご飯食べててタイムキーパーできなくてすみませんでした〜カレイの甘酢あんかけは美味しかったです!
- 全然大丈夫です〜!おなかすきました🎣
- 明日はコメダ珈琲に行きたい気分だけれど暑いから悩み中。。
- @haruguchi
- 何書こうかな、、、
- 小銭を穴に落として、どうにかしようとして覗いていたら完全に不審者でした
- @napple29
- パーシャルの中でパーシャルを呼ぶと動作が遅くなる、と見たことがあるのですが誰か知見ありますか、、??
- パーシャルがそもそもおそいです。github/view_components をつかうとか https://viewcomponent.org/
- ありがとうございます〜〜〜〜、、、、会社の古のコードが四重くらいでパーシャル呼んでで困っていました、、、、
- まずは rack mini profiler で profile して、ボトルネックを特定するのが初手かなとおもいます (ほんとうにパーシャルのせいなのか?)
- パーシャルのせいじゃない可能性大です(震)
- プロファイリングしましょう。プロファイリングして測れないと、改善するべきポイントがそもそもわからないので改善できないです
- @paru871
- 表示のエラーが出たのでエラー文を読んでいたら夢中になってしまって、HackMDの気づきがかけませんでした。。あとで書いておきます!エラーもWebpack周りのようなので後ほど解決策を共有します!
- すみません、調査してくださってありがとうございます!!
- 気になるところがあったんですがこの後(じゃなくても良いですが)時間ありますか?!
- ありがとうございます!時間あります!!
- いや全然解決できないかもですが、、、😂
- @Saki
- 司会とドライバーありがとうございました! webpackerが本当に厄介...!
- haruguchiさんは線香花火会いつ開催するんですか??
- では明日、琵琶湖集合で!! 🚀
- 東京で!!!!!電車代出すんで!!!
- @cafedomancer
- エラーがでているのは webpack の compile に失敗しているせいです。webpack がなんでうまく動いていないかはこの時間では追えませんでした。node が新しすぎるせいというのはありそう
- 僕も前nodeのバージョン下げたら上手くいきました(LEFさんと一緒)
- 下げようと思ったら python がないと言われて下げられませんでした (泣)
- LEF
- 今日の分報にちょっと書きましたが、nodeを12くらいまで落とすとうまくいくかも…🤔
- ありがとうございます!うまくいきましたーー🙌
- コメダはボリュームあって美味しいですよね☕
- 暑が夏いぜ!🌻
- 🍧
- 🌊🧊🍺🏖🏝
-----
### 8/10(水)の「Webpacker::Manifest::MissingEntryError in コントローラー名#アクション名」のエラー解消について
👉 エラー解消のためにやったこと
1. nodeのバージョンを「12.22.12」に下げる
2. webpackerのインストール
3. webpackerのコンパイル
👉 nodeのバージョンを自動で切り替えられるようにするため、`.nvmrc`と`.node-version`の2つのファイルを設置しました。
- 「JavaScript環境の設定」プラクティスでは上記ファイルに対応する設定の指示が今年に入ってから更新されていますので、`.nvmrc`の設定ができている方は特に何もしなくてOKです。
- 昨年までに「JavaScript環境の設定」プラクティスが修了している方は下記のリンクから`.nvmrc`の対応をお願いします。
[JavaScript環境の設定 | FBC](https://bootcamp.fjord.jp/practices/177)
👉 BootcampアプリのWikiにもnodeの切り替えの方法の説明があります。
[nodeのバージョン切り替え · fjordllc/bootcamp Wiki](https://github.com/fjordllc/bootcamp/wiki/node%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88)
👉 nodeのインストール用コマンド(nvm使用の場合)
- インストールされているnodeのバージョンのリストを表示
- `$ nvm ls`
- 指定したバージョンのnodeをインストール
- `$ nvm install 12.22.12`
👉 よくわからない場合は一緒に設定をやりますので、ドライバーに指名された場合でもご安心ください😊
👉 今日お見せできなかったviewが無事に表示されましたのでご報告です!

------
## 2022\-08\-11(木) 祝日なのでお休み
------
## 2022\-08\-12(金)
### タイムキーパー
### ドライバー
### 読んだところ
- P.99 [2-4-2途中 layoutテンプレート]〜
### 次回
- P.105 [2-5-1途中 number_with_delimiter]
### 自由に使う共有スペース
- `format`の中身
```ruby!
respond_to do |format|
format.html do |html| #iphoneの場合のみリダイレクト
html.mobile {redirect_to profile_path}
end
format.json {render json: @book}
end
```
```ruby!
pp format
#=>
#<ActionController::MimeResponds::Collector:0x00007fa45838ed80
@format=
#<Mime::Type:0x00007fa47e6db0f8
@hash=4579222365154991862,
@string="text/html",
@symbol=:html,
@synonyms=["application/xhtml+xml"]>,
@responses=
{#<Mime::Type:0x00007fa47e6db0f8
@hash=4579222365154991862,
@string="text/html",
@symbol=:html,
@synonyms=["application/xhtml+xml"]>=>
#<Proc:0x00007fa45838ec40 /Users/hattorisaki/rubybook/book_admin/app/controllers/books_controller.rb:8>,
#<Mime::Type:0x00007fa47e6d3420
@hash=-1206771205598511039,
@string="application/json",
@symbol=:json,
@synonyms=["text/x-json", "application/jsonrequest"]>=>
#<Proc:0x00007fa45838eb28 /Users/hattorisaki/rubybook/book_admin/app/controllers/books_controller.rb:12>},
@variant=[:mobile] # ✅これ!! >
```
### 各自の疑問点や気づき、学んだこと
- @maimu_x2x
- +mobileでモバイル対応が可能なことは知らなかった👀
- pp使ったことがないため、今度使ってみようと思います!
- LEF(代読お願いします🙏)
- `=~`メソッドで正規表現マッチングすることを忘れていたので参考になりました。
- `pp`メソッドを使うと整形してくれることを今まで知らなかったので、これまで使っていこうと思います。
- ターミナルの表示から`p`のメソッド結果を探すのが大変で、近くに`p "ああああああああああああ"`みたいな形にして目立つように書いてます。 :wakaru:
- @haruguchi
- pp 大好き倶楽部に入ってます!(tap大好き倶楽部にも入ってます)
- helperメソッドは`helper.mthod`でコンソールで確認できる
- @saki
- layoutテンプレートの存在、普段あんまり意識してなかったので復習になった!
- `app/views/layouts/application.html.erb`は自動的に作られる(`rails new`とかのタイミング?)
```ruby
<body>
<%= yield %> # ここにviewの各テンプレート(newとかeditとかshow)が入る
</body>
```
- layoutsテンプレートを複数作成したことがないが、複数ある場合は、呼び出すcontrollerのアクション内で、`render :show, layout: 'awesome_book'` と書けばlayoutsテンプレートも指定できる
- アクセスする媒体によって表示するテンプレート
- おっきいJSONデータを自作サービスで扱ってるので`pp`がないと生きていけません...!!🙏👼✨
- @paru871
- pp好きなのでお話しできてよかった!
- variantsを使うとテンプレートを切り替えできる。。。が今は殆ど使われていない様子。
- ヘルパーメソッド便利すぎる!
- @niikz
- ヘルパー便利!
- `form_with` で簡単にフォームができてすごい
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @maimu_x2x
- 救急病院と消防署の間に住んでいるため、途中うるさくて失礼しました🙇🏻
- JSPrimer読んでみようと思っているのですが、皆さんWeb版を読まれましたか?
- [JavaScript Primer \- 迷わないための入門書 \#jsprimer](https://jsprimer.net/)
- @haruguchi
- maimu_x2xさんの`x2x`はなんだろう?maimu maimuと予想!
- 線香花火を買ったので今日の夜やります!琵琶湖集合で!
- 🏃♀️💨
- @Saki
- 今日は1日だらだらしていました! 明日から自作サービスちゃんとやります💪
- @paru871
- 私もちょうど今、JSprimerを読み直してるところです!
- LEF
- 先程のデバッグの素晴らしい記事を見つけたので共有致します。 [困ったときはターミナルへ出力だ!プリントデバッグ入門 - プログラミング漫遊記](https://haruguchi-yuma.hatenablog.com/entry/2021/12/14/101520)
- @niikz
- Postman を使ってAPI接続を試しているのですが、むずかしいのでコマンドからできるtwurlを試してます!
### 連絡事項や確認・相談
- 2章が終わったらKPT会やろうと思ってるんですが、どうでしょう🤔
- 参考:[第1回KPT会 Ruby本輪読会\(🅱班\) \- HackMD](https://hackmd.io/-AzrGuXgRBuDZl-LgYtJmA)
- :+1::waiwai!:
- お盆休みはとくに無しで開催します!
-----