# 【第11週】パRails輪読会 \(2022\-10\-03\~ 2022\-10\-07\) ###### 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\-10\-03(月) ### 連絡事項や確認・相談 ### タイムキーパー - @fuwa ### ドライバー ### 読んだところ - P.288 [6-3 OAuthを利用して「GitHubでログイン」機能を作る]〜 ### 次回 - P.209 [リスト6.9 find_or_create_from_auth_hash!の実装]〜 ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - 環境変数の設定をやったことがないため、流れを追えてよかった - プラクティスからOAuthの課題がなくなってしまったため、この章を通じて勉強したい - 発展編にいったんですね確か!https://bootcamp.fjord.jp/practices/41 - @fuwa - `dotenv-rails`gem初めて知りました〜環境設定ってこんな感じに設定するんですね。 - `OmniAuth`とか`OAuth`も初めて聞きました。初めてだらけですね。 - 自作サービスで使うのかは不明だけど、覚えておいて損はないはず! - @tomonari - dotenvで環境変数の設定をするところが参考になりました。 - omniauthのところ技術検証ですごい苦労したので、ここを先に読んでいたらもっと理解が早かったのかなと思いました:cry: - @garammasala29 - dotenv-railsを使っていて`credentials.yml.enc`でクレデンシャル情報を管理したことがないかも。 - OAuth2.0とか1.0とかもよくわかっていない。自作サービスのとき、あとで学習しなおそうと思っていた - CallBackのURLを間違えていてハマったのを思い出した。。。 - @haruguchi - 久しぶりにきたらハンズオンパートだった - この章は他の章と比べると難易度が抑えられていて楽しいですよね!実装要件がシンプル! - OAuthやOmuniAuthは自作サービスでとてもお世話になりました:pray: - Saki - 自作サービスでGitHubログイン機能を実装して参考にしたので、結構理解できた - コードの読み下しした時のを参考までに貼っておきます。`auth_hash`の中身を見ると結構分かりやすかったです! ```ruby # config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do # development & test 環境に対して同じclient id&secretを設定する if Rails.env.development? || Rails.env.test? provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'], scope: 'read:user' # ここでデータへのアクセスのscopeを指定できる else #production環境での設定 provider :github, Rails.application.credentials.github[:client_id], Rails.application.credentials.github[:client_secret] end end ``` ```ruby! # model/user.rb def self.find_or_create_from_auth_hash!(auth_hash) provider = auth_hash[:provider] uid = auth_hash[:uid] name = auth_hash[:info][:nickname] image_url = auth_hash[:info][:image] # 引数に渡したproviderとuidがUserのレコードに有れば、そのオブジェクトを返す # 無ければ、引数に渡したproviderとuidに加えて、nameとavatar_urlを設定してレコード作成&そのオブジェクトを返す User.find_or_create_by!(provider: provider, uid: uid) do |user| user.name = name user.image_url = image_url end end ``` - dot-envrailsの使い方 - gemをインストール - `.env`ファイルをアプリ直下に作成 - `.gitignore`に追加 ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @maimu_x2x - 最近朝型にシフト中なのですが、時間がうまく使えず夜型に戻りそうです・・・ - 水曜日の卒業生座談会に参加しようと思っています! - @fuwa - 以前ボソっと言っていた`letter_opener`で`clear`ができない件、バージョンを上げたら直ってしまいました。。 - `~>` の名称多い! - にょろにょろやじるし - @garammasala29 - 自作サービスの本番環境のデータが消えてまっさらになってしまいました。DBには残っているんですが、どなたか反映させる方法知りませんか?本番環境なので怖くて - Saki - デザイン、色を決めるのが難しい! レイアウトはCSS上級よりはずっと簡単なのでがんばります... - @haruguchi - 気づいたら10月ですね。 :gya~: - 鍋いつから始めるか問題みなさんどうしてますか? - 11月から?12月? - 鍋はいつでもOKでは?冬にアイス食べるのと同じだと思います - そうめん? ------ ## 2022\-10\-04(火) ### 連絡事項や確認・相談 ### タイムキーパー ### ドライバー ### 読んだところ - P.209 [リスト6.9 find_or_create_from_auth_hash!の実装]〜 ### 次回 - P.303 [イベント用のモデルを作成する]〜 ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - ヘルパーメソッドとはlink_toやform_tagのこと - コントローラ側でhelper_methodを指定するとview側でlink_toとかと同じように扱えるということと理解 - LEF(代読お願いします) - hamlの書き方がだんだん分かってきた気がします! - Macでhamlの環境構築するときは、XCode周りも気をつける必要があることが分かりました。 - 後でWSL2でやってみて、どんなログが出るのかも確認したいと思います。 - レイヤードアーキテクチャーにおけるレイヤーの方向は参考になりました! - controller <- helper <- view (依存の関係) 、になっているので、includeするとcontroller <-> helperになってしまい、controller で helper を include しても動作しない可能性が高い。 - Saki - `!!session[:user_id]`と書くことで、中身が入ってたら`true`を返し、入ってなかったら`nil`なので`false`を返す。 - `application_controller`に書いたメソッドなので、ビューでも使いたかったら`helper_method :<メソッド名>`と書く。 - xcodeまわりのエラーは結構ググってなんとか乗り越えてきた感じなのでよくわかってない... - @garammasala29 - hamlの導入ってこんなに難しいものなのか。。。 - C API に依存している gem だとビルドが必要 (with native extensions ってやつ) なのでうまく動かないことがあります。make や clang が必要 - `request.env['omniauth.auth']`の中身を確認すればよかったですね。忘れていました - controllerとview両方で使いたいメソッドはcontrollerで`helper_method`と定義。レイヤードアーキテクチャを深掘りしたい。 - @tomonari - find_or_create_byメソッドはログイン機能作る時に便利ですね〜 - 後ろに!ついた方だと例外が出てエラー検知しやすいって前の章のどこかでも出てきたような気がします。 - @haruguchi - hamlitって早いやつだっけ? :soudesu: :arigatoudesu: - https://k0kubun.hatenablog.com/entry/2015/03/31/004021 - @fuwa - `!!session[:user_id]` でfalseまたはnilのときはfalse、それ以外はtrueに変換することができる - 途中から来たのでちゃんと状況がつかめていないのですが、haml導入って大変なんですね。。。 ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @maimu_x2x - 今週が3連休だと今日知ってめっちゃ喜んでいますw - ありがとうございます! - @fuwa - vue.jsやっぱなんもわからんでした。。 - 行きつけのBARが今週末で閉店してしまうので悲しみです - 行きつけのBARかっこいい!欲しい!行きつけほしい! - @garammmasala29 - makeインストールなんどもやり直しさせられます。明日までになんとかしておきます。 - みなさんのおかげで自作サービスのデータが復旧しました。悩みは伝えるものだなぁ :mottokoiyo: - LEF - FBCのチーム開発はslimでしたっけ? - :sousou!: - :arigatougozaimasu!: - @haruguchi - Ruby楽しいですね! - @tomonari - 北海道は今朝混乱しましたか?(例のミサイル)地下に逃げろと言われても? - Jアラート来て、たいへん不安な気持ちになりました。地下あるけどぼくの部屋ではないw - 前回も同じ時間で同じルートでした。たぶん飛行機が飛んでいない時間で、陸に落ちないように津軽海峡あたりを狙って打っているのだと思います。 ------ ## 2022\-10\-05(水) ### 連絡事項や確認・相談 ### タイムキーパー - @fuwa ### ドライバー ### 読んだところ - P.303 [イベント用のモデルを作成する]〜 ### 次回 - P.309 [6-4-4 イベント登録用のフォームを作る]〜 ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @garammasala29 - モデルのバリデーションに文字数制限忘れがちらしい。DB側では最大決めていない。 - ログイン関連のメソッド、自分で作ってとなったら大変そう - @tomonari - buildがnewのエイリアスなのを知りました。lefさんいつもいい質問しますね! - validateでメソッドを指定するやり方使いこなしたいですね。return後の挙動がいまいち把握できていないかも? - @fuwa - buildはnewのエイリアス - ユーザーの入力を受け付ける箇所には文字数制限をつけるべし - LEF - `errors.add`でaddメソッドを使って手動でエラーメッセージを追加できることが分かりました! - [Active Record バリデーション - Railsガイド](https://railsguides.jp/active_record_validations.html#errors-add) - newとbuildの細かな使い分けが分かって良かったです。ありがとうございました! - 今調べてみたらこんな記事がありました。[[Rails][ActiveRecord]modelのnewとbuildの違いについて | Coffee Breakにプログラミング備忘録](http://to-developer.com/blog/?p=1874) - Saki - (ほぼ)全ルーティングのアクション実行前に何かさせたい(ログイン等)場合、`application_controller`で`before_action`を記述する。 - しかしこれだとトップページにもアクセスできない/初めてのログインもできなくなってしまうので、これを打ち消したいコントローラで`skip_before_action`する - `owner_id`まとめ (あらかじめEventモデルに`owner_id`を作ってたので混乱してしまいました) - そもそもの目的:イベントを作ったUserと、そのUserに属する複数のイベントを1:多として関連付けしたい。`user_id`だと分かりにくいので`owner_id`という外部キーにしたい。 - Eventモデルに`owner_id`カラム(biginit型)を作成する(このときはUserと関連付けしてない) - Userモデルに `has_many :created_events, class_name: "Event", foreign_key: "owner_id"` と記述することで、`foreign_key`を中身を`user_id`、名前を`owner_id`にできる。これを書かないと`user_id`を外部キーとしてRailsは探す。(この場合user_idを外部キーとして設定してないので多分エラーになる?) - @haruguchi - migrationの段階で `xxx_id`としておくと外部キーを明示的に指定したことになるらしい。 - https://railsguides.jp/association_basics.html#belongs-to%E3%81%A8has-one%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E9%81%B8%E3%81%B6%E3%81%8B ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @fuwa - さっきMacBookの画面がつかなくなって慌てました - 急に寒くなってきましたね〜久しぶりに長袖着ました - LEF - ニキビの薬を毎日塗っていたら少しずつ良くなってキタ━(゚∀゚)━!!💊 👏 - @garammasala29 - さむすぎる。8度。雪が降りそう。憂鬱な気分。笑 :tea:🧣🧥 - @Saki - 外部キーいつも`reference`オプションでよしなにやってもらってたので、難しかった - @haruguchi - 朝散歩行って、半袖で後悔しました :kazenoko: - 企画やります - 楽しみです!!👏 - 👏 ------ ## 2022\-10\-06(木) ### 連絡事項や確認・相談 ### タイムキーパー - ガラムマサラさん ### ドライバー - Saki ### 読んだところ - P.309 [6-4-4 イベント登録用のフォームを作る]〜 ### 次回 - P.312 [6-4-5途中 「create.js.erbでは、さらにerrorsという部分テンプレートを呼び出しています」〜] ### 自由に使う共有スペース 梅本さん解説 > SJR はサーバー側で JS 組み立ててそれをレスポンスとして返すやつのこと server-generated javascript responses 返すやつ = そういうやり方 で、そのレスポンスの JS をブラウザ側で実行する ajax 通信はわかります? すごくざつにいうと JS でサーバーにリクエストを投げて、サーバーからレスポンスを受け取って JS で処理する JS でサーバーにリクエストを投げて = local: true じゃない = remote = fetch() これを裏側でやってるのはたぶん rails-ujs です ### 各自の疑問点や気づき、学んだこと - @maimu_x2x - 昨日の話ですが・・・Railsのプラクティスで当たり前のようにcurrent_userメソッドを使ってましたが、deviseを使わない場合は自分で定義しないとダメなんですね。 - Railsで日時を扱う場合はRime.zone.nowやTime.currentなどActiveSupport::TimeWithZoneオブジェクトを使う - @garammasala29 - Railsドキュメントは公式のものを読もう - RailsはTimeZoneWithクラスを利用するのが一般的 - SJRとは - LEF - TurbolinksやAjax通信、SJRやrails-ujsなど、自分がまだあまり知らない内容がたくさん出てきたので後で復習しようと思いました。 - `datatime_select`のDiscordのコメントに「ダメ」のスタンプが貼られていたのは、非公式のドキュメントだから?(メソッドそのものの問題ではない?) - はい - @tomonari - RailsではRailsで設定したタイムゾーンを使うため、ActiveSupport::TimeWithZoneを使うんですね。これからGoogleカレンダーと連携したアプリを作るのでタイムリーな話でした。 - Ajax通信は前の章のどこかでやったけれどあまり理解できていなかったので、復習しないといけないと思いました。 - Saki - `form_with`はデフォルトでAjax通信になっている。これを`local:true`と書くと通常の画面遷移になる - `form_with`を使う時当然のように`local: true`と書いてあったので、`scaffold`での書き方以外にこういう選択肢があるのかと発見があった。scaffoldだとsaveが失敗したときの処理は、`render :new`とあった。 - `datetime_select`便利 - JS周りの技術の話が出てくると手も足もでない!Ajax通信の理解から出直さねば ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - @maimu_x2x - 朝型チャレンジ継続中なのですが、夕方に猛烈に眠くなります・・・ - そしてお腹が空いてしまう😂 - LEF - 急に寒くなったので電気ヒーター出しました。 - - - - ----- ## 2022\-10\-07(金) ### 連絡事項や確認・相談 - 10(月)は祝日なのでお休みです〜 ### タイムキーパー - Hikaruさん ### ドライバー - fuwaさん ### 読んだところ - P.312 [6-4-5途中 「create.js.erbでは、さらにerrorsという部分テンプレートを~」]〜 ### 次回 - P.314 [6-5 イベントの閲覧機能を作る]〜 ### 自由に使う共有スペース ### 各自の疑問点や気づき、学んだこと - @garammasala29 - エラーが出た時の言語化が毎回難しい - Ajaxのことがしっかり理解できたらエラーも解消できたので勉強したい。 - 現場Railsの8章に知りたいこと書いてありました!土日で読みます!haruguchiさんに感謝。 - i18n_generators、なぜyamlファイルを作ってくれなかったのだろう。 - @tomonari - Ajaxについて知りたかったら現場Rails読むといいというのを教わったので、読んでみたいと思います。現場RailsはRailsのプラクティスの時に読んだのですが、サンプルアプリが動かなくて挫折しました:cry: - bootstrapのバージョンも違っててすごくしんどいんですよね、、、 - リクエストやレスポンスの内容を確認してエラーの解消をするというのがまだ難しいと思いました。勉強していきたいです。 - hikaru - 浦島太郎でした...この章ちゃんと復習します... - @fuwa - エラーから修正箇所を見つける方法について勉強になりました。難しいですね〜エラーをちゃんと読まねば - 結局日本語化のgemはどうしたらよかったんでしょう。。。 - @haruguchi - ややこしいのが - Rails6.1以降 form_withのlocalオプションのデフォルト true - Rails6.0とか5とか form_withのlocalオプション false - なのでコードが同じでもバージョンによっては挙動が違う - form_forとかは混ぜるとまたややこしい、、、 - 6.0.6なのに書いてました...😱 - Saki - エラーが出たときは、エラーメッセージから、どういうリクエストが行われているかを読み取る。エラーメッセージをきちんと読むのは当たり前のことだとは思うのですがあんまりできてないのでちゃんと読まねばと思いました - SJRは、createが失敗した時の処理をコントローラに`else~`と書かずに、`create.html.erb`ファイルを作って処理を書くだけでエラーを返してくれる。 - フロントエンド周りの知識つけたいです!! ### 本日の振り返り(よかった点・次回に向けての改善点・今の気分などなんでもOK) - hikaru - ふわさんドライバーありがとうございました〜 - いえいえ〜 - 冬です。室温が20度切りました...さむい。 - Saki - いきなり寒い!! - haruguchiさん梅本さんありがとうございました😭🙏✨この後リポジトリの更新を私がやるのでちゃんとエラーメッセージが出ることを見届けてからpushします - 来週は月曜は祝日でお休みです!! - @fuwa - 寒すぎて衣替えしちゃいました - vue.jsが前よりはわかってきたかもしれない…? - @tomonari - 寒いですね〜こたつを出したいですが、また土曜から少し暖かくなるということなのでまだ出せないかも? - @haruguchi - 梅本さんの安心感 プライスレス! - 僕はなんもやってない :sishou: - 3連休サイコー スポーツの日なのか!家で漫画読もう! - @garammasala29 - いつもいつもharuguchiさん、梅本さんに感謝です。 - 無言の状態が続くと何か声を発したくなります。:wakaru: :hizagauzuku: -----