# 【第8週】パRails輪読会 \(2022\-09\-12\~ 2022\-09\-16\)
###### tags: `パRails(2回目)`
- [開催概要](https://hackmd.io/rOcLR0riRqmOgEF0_Ssm0A?both)
- [パRails輪読会 ノートまとめ](https://hackmd.io/5emISRvRRXapmakSiHnFJg?both)
## パRailsのサンプルコード・正誤表
- [サポートページ:パーフェクトRuby on Rails【増補改訂版】:|技術評論社](https://gihyo.jp/book/2020/978-4-297-11462-6/support)
- [パRails 環境構築の手順](https://hackmd.io/y7qb2BRMT2Wd4tAtKYObcQ)
## 目次
[TOC]
------
## 2022\-09\-12(月)
### 連絡事項や確認・相談
### タイムキーパー
- Paruさん
### ドライバー
- Sakiさん
### 読んだところ
- P.221 [5-1-5途中 キューを追加すると、〜]
### 次回
- P.227 [5-2-2 Active Storageの動作と設定]
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- @maimu_x2x
- 会社のコードを見たらsidekiqのretryはほぼ0と値が指定されていました。明示的に書かないとダメなのか・・・?
- queの追加は設定ファイルにデフォルト値を定義しておいて、それを読み込んでる実装がされていたため、逆にデフォルト値を指定し忘れるとどうなるんだろうと気になりました。
- hikaru
- キューは開発で出てきたらまた見直します...こんなときはこうする、みたいな処理が色々書けるということがわかりました。
- Active Storageで追加された属性?はカラムではなく別のテーブルで管理される
- @napple29
- 久しぶりにきたら何もわからんとなった…
- @Saki
- 条件によって追加するキューを決める処理
```ruby
class AsyncLogJob < ApplicationJob
# queue_as :async_log
def perform(message: "hello")
AsyncLog.create!(message: message)
end
# 以下を追記
queue_as do
case self.arguments.first[:message]
when "to async_log" # 渡された第一引数であるmessageが"to async_log"だったらasync_logキューに追加
:async_log
else
:default
end
end
```
```ruby
# キューasync_log に追加
irb(main):007:0> AsyncLogJob.perform_later(message: "to async_log")
Enqueued AsyncLogJob (Job ID: 711256dc-2f83-47a3-a473-41698702298d) to Sidekiq(async_log) with arguments: {:message=>"to async_log"}
=> #<AsyncLogJob:0x00007fb6c851e3f8 @arguments=[{:message=>"to async_log"}], @job_id="711256dc-2f83-47a3-a473-41698702298d", @queue_name="async_log", @priority=nil, @executions=0, @exception_executions={}, @timezone="UTC", @provider_job_id="03ad622cfb3f395f977732d2">
#=> @queue_nameが"async_log" になっている!
# キューdefaultに追加
irb(main):008:0> AsyncLogJob.perform_later(message: "default")
Enqueued AsyncLogJob (Job ID: b32d2a69-f1d4-4362-8c6f-4eb05803a811) to Sidekiq(default) with arguments: {:message=>"default"}
=> #<AsyncLogJob:0x00007fb6cfe81b00 @arguments=[{:message=>"default"}], @job_id="b32d2a69-f1d4-4362-8c6f-4eb05803a811", @queue_name="default", @priority=nil, @executions=0, @exception_executions={}, @timezone="UTC", @provider_job_id="5166192f2bc70a0ccd2aa19d">
```
- `/sidekiq`を見ると実際にキューに追加されるのが見れて分かりやすい!
- はるなさんからredisとsidekiqを一緒に使うことが分かっていれば大丈夫と仰っていてホッとした
- @fuwa
- ジョブの内容によってキューを決定することができる。`perform_later` の引数で判別する感じ?
- 今チーム開発でわたわたしている`deliver_later` メソッドがピンポイントで出てきてびっくり!Active Job経由でメール送信を非同期実行できるらしい。引数に`wait:` を渡したら結局どうなるんだろう?
- @tomonari
- ActiveJob使ったことがないので復習しておきたいです!sidekiqってAA出るのが面白いですね。
- @paru871
- retry_onのオプションがデフォルトのときは何も書かなくていいのか、調べておきます。
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @paru871
- 久しぶりの参加となってしまって浦島太郎状態でしたが、ホーム感が溢れていてホッとしました。
- :waiwai:
- @maimu_x2x
- ActiveStorageのn+1問題をやり忘れて提出してしまった・・・
- @fuwa
- チーム開発、前のissueを参考にすればいけるでしょ〜と思っていたのに通知周りが難しくて手こずっています
- まだ暑いですが、秋鮭売っていたのでこれからホイル焼きにします〜
- hikaru
- ぎっくり腰を防ぐWebサービスまだですか...?:nakerebatsukuru:
- SakiさんRedisとSidekiqのサンプルありがとうございました〜〜
- いえいえ〜☺️
- @napple29
- RubyKaigi現地参加してもぼっちになりそう…と否定的な気持ちで行ったのですがフィヨルド卒業生というだけで知り合いが増えるので皆さん松本で会いましょう!!!笑
- Sidekiqのお気に入りメソッド共有しますね
https://github.com/mperham/sidekiq/blob/1096df58a4f428d12b4b002f8f845f604073fdb1/lib/sidekiq.rb#L55-L57
- ❨╯°□°❩╯︵┻━┻
- @Saki
- 中間テーブルでモデルの関連づけをやったら勝手にレコードがcreate/destroy されると思ってました😂 フォロー機能復習したらちゃんとレコード追加の処理してました! 自作アプリでdestroyの処理で詰まってます😇
- @tomonari
- RubyKaigi面白いけれど疲れました。
------
## 2022\-09\-13(火)
### 連絡事項や確認・相談
### タイムキーパー
- Hikaruさん
### ドライバー
- Saki
### 読んだところ
- P.227 [5-2-2 Active Storageの動作と設定]〜
### 次回
- P.235 [5-3 Action Mailerによるメール送信]〜
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- @maimu_x2x
- ActiveStorageはvalidationヘルパーが不足している
- プラクティスで私はgemを使いました。
- cacheも不足しているため、今後に期待〜!
- ActiveStorageはポリモーフィック関連ということを知らないでプラクティスでは使っていた。
- hikaru
- Active Storageは一長一短。他のgemも検討の余地があるみたい
- @fuwa
- サムネイル生成には`imageProcessing` と `ImageMagick` を使う。が、後者は別のライブラリでもOK。いろいろある
- `Shrine` がいい感じなのかな?`CarrierWave` はオワコンらしい
- 参考記事なさすぎ問題はあります!!ドキュメントを英語で読み込む必要が、、、:scream:
- まじですか、それはちょっと不安ですね
- @Saki
- Active Storageはポリモーフィック関連を採用している→コメント機能で学んだけど忘れたので復習せねば...
- `config/storage.yml`は、ファイルの保存場所の設定などをする。追加で設定が必要な時に戻って来ればよさそう。
- `resize_to_limit`でリサイズもできる
- Rails7からはimagemagickではなく、libvipsがデフォルトになった
- [Make vips the default variant processor for new apps by brenogazzola · Pull Request \#42744 · rails/rails](https://github.com/rails/rails/pull/42744)
- ダイレクトアップロード
- そもそもアップロードには、アプリケーションサーバー経由(デフォルト)と、直接クラウドストレージにアップロードがあることを初めて知った
- ダイレクトアップロードのメリット:アップロードにかかる時間を減らせる。アプリケーションサーバーへの負荷を減らせる
- 気になったこと
- libvipsをインストールして設定追記したが、ちゃんとlibvipsに変わっているか確認する方法が分からなかった
- rails7ではimagemagick使おうとしたら設定の追記
- P.232でダイレクトアップロードするメリットの話がでたが、デメリットがかいてなかったので、「それならなぜデフォルトではアプリケーションサーバーを経由するのだろう」と思った
- Shrineは拡張性が高い(機能を手軽に追加できる)。CarrierWaveはあんまりメンテされてないから使わない方が良い?らしい。
- ActiveStorageには、バリデーションのヘルパーメソッドがない。cacheもshrineの方が手軽にできるらしい
- @haruguchi
- 久しぶりにきたらActive Job終わってた :wara:
- Active Storage簡単で良いですよね〜
- ダイレクトアップロードの話はサーバーサイドでの画像変換が挟まると処理が遅くなるとかかなぁ
- @tomonari
- ActiveStorageでS3とかのクラウドで画像データ保管するのも簡単にできるのかな?気になります。
- 簡単です!S3は記事もたくさんあります!設定ファイルもデフォルトで書かれている!
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @maimu_x2x
- しばらく続いていたパRailsわからないモードがちょっと落ち着いています。
- 会社で上司や同僚が一気に退職する予定でちょっと落ち込んでます・・・ロイホのパフェを食べて元気出したい。
- どうぞ!!
<img src="https://i.imgur.com/5O32jzU.jpg" width="300">
- ひゃ〜〜〜〜〜〜❤️
:tea:
- hikaru
- 難しいと逆に結構なスピードで進んでしまうなあ...
- 腰が!やばいです!司会やりながら何回かピキッた
- @fuwa
- 今日の内容は自作サービスで使う予感がする。
- 買おうと思っていたアウトレットのギターが売り切れてしまって非常にがっかりしています
- 何買うんですか?おおー!ショートスケール!弾きやすい!
- チーム開発の通知周りがわからなすぎて悲しくなってきました
- @haruguchi
- どちらかというとハンバーグが食べたい!
- 本を広げすぎて大変なことになってるので本が勝手に本棚に帰っていってほしい
- 電子書籍にしましょう!
- @Saki
- 画像のアップロードは身近だったので結構わかって面白い!
- active job は よく分からなくて、キュー追加したのを sidekiq を軽く確認して終わっちゃいましたね..。
- 重い処理を行うときは必須ですね!
- rubykaigi振り返りブログを読んでまた羨ましい気持ちが再燃してます🔥
-
------
## 2022\-09\-14(水)
### 連絡事項や確認・相談
### タイムキーパー
- @fuwa
### ドライバー
### 読んだところ
- P.235 [5-3 Action Mailerによるメール送信]〜
### 次回
- P.241 [5-3-3途中 また、メール送信をするときは、迷惑メールとして〜]
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- @maimu_x2x
- SPFやDKIMの発行方法がわからないため、調べてみる。
- ActionMailerが自動でmultipart/alternative形式のメールを作成してくれるの便利。
-
- hikaru
- 確かに簡単にメール送れそう
- メーラークラス`.with(to: アドレス, name: 名前).メソッド.deliver_now`のような感じで使えるみたい
- @Saki
- ActionMailer初めてちゃんと学んだ!
- SendGridでメール送信の設定を行う
- メール送信の仕組み
- `app/mailer/user_mailer.rb`に、メール送信するメソッドを作る
- ここでインスタンス変数を作っておくと、`app/view/user_mailer/welcome.html.erb`もしくは`text.erb`でインスタンス変数を使える(いつものRailsのViewとControllerの仕組みと同じ)
- 実装したメール機能を`test/mailers/pervie/user_mailer.rb`を使って、送信した時のプレビューを見ることができる
- 送信したと勘違いしてしまったが、ここで自分が作ったメール送信機能がどう表示されるか確認できる
- `deliver_now`は大量にメール送信しようとすると、メール1万件送信が終わるまで次の処理ができないってなる。ので、非同期処理である`deliver_later`はよく使う。
- @fuwa
- Action Mailerでメール送信を実装できる。実際に送るときはSendGridが主流なのかな?
- Railsチュートリアルで2年前くらいに登録したような気がするけど今でも使うのかな?
- deliver_laterが使われていたけどチーム開発の通知と同じノリなのかしら。。駒形さんのブログにはそんな感じのこと書いてあったような
- @tomonari
- SMTP =Simple Mail Transfer Protocol(シンプル・メール・トランスファー・プロトコル)の略で、そういうメール送信の型があるらしい?
- SPF =Sender Policy Framework
- DKIM =DomainKeys Identified Mail
- なりすましを防ぐ技術らしいが、よく分からない
- メールが送信されるサーバーが安全かを証明する仕組みだった記憶です・・・
- @haruguchi
- 読んでないので雰囲気で
- メール配信サービスだと
- SendGrid Mailgun Postmark があるみたいですが、フィヨルドブートキャンプのおすすめはPostmarkみたいですね!
- SendGridは誰かがめっちゃハマってたイメージが、、、
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @maimu_x2x
- 質問するの難しいですよね・・・
- 仕事で言ってる意味がわからないとコテンパンにされた経験を経て、今は伝える前に箇条書きで分解してから話すように気をつけてます・・・あとは開き直り。
- 二重配信事件何度かあって、大変でした・・・
- @fuwa
- 質問するのむずかしい〜〜〜
- 今日ハロワに行くとき電車に乗ったらお向かいの席の人が前職の知り合いでした
- @Saki
- SendGridは動かすのはなかなか大変そうなので、輪読会ではやらなくてもいいかも?
- なぜかメール送信したのに`tmp/mails`にファイルが保存されず???でした
- hikaru
- 金曜日(20:30〜?)にGood First Issueのモブプロ会を開こうかな〜と考えています!ご都合が合えば是非!
- :gogo!:
- :tada:
- @haruguchi
- 寝坊した
- ハンバーグ作らなかった
-
------
## 2022\-09\-15(木)
### 連絡事項や確認・相談
### タイムキーパー
- Hikaruさん
### ドライバー
- tomonariさん
### 読んだところ
- P.241 [5-3-3途中 また、メール送信をするときは、迷惑メールとして〜]
### 次回
- P.246 [5-4-4 Action Mailboxの処理の流れと実装手順]
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- hikaru
- Action Mailboxはメールを受信したときの処理を提供するもの
- たとえばメールの返信をGitHubのコメントとしてポストするとか
- メールサーバーやジョブサーバーがそれぞれ別に存在していてRailsアプリはそれらを仲介して指示を出しているイメージ
- @maimu_x2x
- ActionMailerはメールを送信するためのライブラリ
- Actionmailboxはメールを受信した時に処理を行うライブラリ
- GitHubのPRメールに返信するとコメントが返せるような機能が実装できる
- メール周りの役割分担を整理したい・・・!
- @Saki
- メールの送信自体は、SendGridなどのメールサーバー、メールサービスがやっている。が、「このタイミングで」「この動作が起こったら」メール送信して、という指示はRailsのActive Jobが行う。
- メール送信もRailsがやってくれてると思ってました...それはメールサーバーを契約しないといけないんですね。
- bootcampはPostmarkを使ってるらしい
- https://github.com/fjordllc/bootcamp/blob/9a82d93c0dac0b45952033c92119ac5f76d34dbb/config/environments/production.rb#L127
- メール通知は、チーム開発のabstract_notifierへの書き換えで携わったのですが、パRails読んで全体の仕組みをわかってなかったことが分かった。分かりたい!
- @fuwa
- Action Mailboxはメールを受信した時に処理を行えるようにするライブラリ。ちなみにAction Mailerはメールを送信するためのライブラリ
- いろいろ機能があるのかな?
- MXレコード = Mail eXchanger レコード DNSレコードの一種
- @tomonari
- メールの内容をDBにコメントとして保存できるのは便利そうですね。
-
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- @maimu_x2x
- 昨日ロイホでパフェを食べて元気になりました! :urayama: :urayama: :subarashi:
- SPFレコードが設定されてるかはGmailで確認できたような?
- @Saki
- まいむさんの説明が分かりやすくてありがたいです🙏✨
- チェックインそろそろいらないかも🤔?? 最近はあんまり必要としてる方はいないのかもと思っています〜
- アイスがやめられない...🍨 ロイホのパフェ調べたら飯テロでやられました:bokan:
- @fuwa
- 最近塩たこ焼きにハマっています
- 引っ越しのバイトをするかスーパーの品出しのバイトをするか悩んでいます
- hikaru
- なんか調子出ません〜パフェ食べるか
- 実装してみたい機能で自作サービスを考えるどうかなあ
- Getting Real じゃないので komagata さんにはじかれます (体験談)
-----
## 2022\-09\-16(金)
### 連絡事項や確認・相談
### タイムキーパー
### ドライバー
### 読んだところ
- P.246 [5-4-4 Action Mailboxの処理の流れと実装手順]〜
### 次回
- P.252 [5-4-5途中 メールの詳細画面で表示されている~]
### 自由に使う共有スペース
### 各自の疑問点や気づき、学んだこと
- @maimu_x2x
- ApplicationMailboxを継承してるクラスを初めて見た。
- 届いたメールに返信してコメントがつけられるコードの詳細が知れて、覚えておきたいと思った。
- git checkoutは魔法のコマンド
- あとでできることを調べてみる
- @Saki
- 途中まで、メールを受信する人=ユーザーと勘違いしていた
- メールを受信する側の機能の話をしている
- `app/mailboxes/application_mailbox.rb`に、メールの振り分け設定を書く。メールを受信した時に、「メールアドレスが◯◯だったら、:comments へ」等。
- `comments_mailbox.rb`
- bootcampはActionMailbox使ってなさそう?
- [bootcamp/app at main · fjordllc/bootcamp](https://github.com/fjordllc/bootcamp/tree/main/app)
- hikaru
- 受信したメールをもとに色々な処理を振り分ける機能があることがわかりました
- @tomonari
- routing処理をmailboxの方でやってるのが面白いとおもいました。
- @haruguchi(読むに値しないので飛ばして!)
- 途中からきてほとんど何もよくわかってないけど、メールと言えば、、国税庁からショートメールが来ました。
-
### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK)
- hikaru
- うめもとさんの切り分けの速さがすごかった
- プロなので!
- tomonariさんドライバありがとうございました...!
- @maimu_x2x
- Railsガイドには書かれていないけど省略ができるRailsの文法をどうやって正しいか判断すればいいんだろうと最近思ったりしています🤔
- 職場の人はソースコードまで飛んで判断してました
- @tomonari
- -youな訳がなかった(大真面目にやってた)
- ジャニーさん!?
- @Saki
- 時間差でやっぱりGitHubからメールがきてました!でもpushを事前に防ぐ機能とかはないんですね〜
- デスヨネ。push されないと検出できなさそう

- pushするのはやっぱり怖いので、モブプロで使うことになったらdiscordで教える感じにしようと思います
- @haruguchi
- プロになりたい!!
- ほんとに最近途中からで雑談しに来ている人みたいになった
-
-----