【第4週】パRails輪読会🚂 (2023-09-11~ 2023-09-15)

tags: パRails🚂

目次


2023-09-11(月)

ファシリ

@hiromisugie

ドライバー

@motohiro-mm

読んだところ

2-3-3 「ルーティングとリソース」から
2-3-4 「例外処理」まで。
PR:https://github.com/KMZ0209/Perfect_Ruby_on_Rails_Ch2/pull/10

次回

2-3-5 「StrongParameters」から。🚂

学んだこと・感想

  • @sharoa

    • scaffoldで作成するようなCRUD操作はresources :publishersの一行を書くだけで定義できる
    • scaffoldで生成されるアクションやresourcesで定義されるルーティングを基本的なアプリケーションの振る舞いと考える。
    • そして、要件に応じてルーティングやアクションの削除や追加を検討するのが良い。
    • resourcesで生成されるルーティングを拡張したい場合はresourcesのブロック中に設定を記述する。
    • resources以外のルーティングパターンもある。
    • またonlyを指定することで、指定したルーティングのみ生成するように制限できる。
    • ユーザーに通知すべき例外処理などは基本的にコントローラが担当する
    • 例外の種類とステータスコードの代表的なものは覚えておこう。
  • @sadanora

    • ルーティング
      • member
        • /publisfer/:id/detailのような個別のリソースに対してアクションを設定する
      • collection
        • /publishers/searchのように全体のリソースに対するアクションを設定する
    • 例外とステータスコードの紐付け
      • 例外の種類によってRailsが特別扱いする例外クラスがある。
        • ActionController::InvalidAuthenticityTokenなら422とか、返すステータスコードが決まっている。
      • それ以外に特定の例外が発生した場合に特定のレスポンスを返したい場合などはrescue_fromを使って定義できる。
        • ログインエラーの場合に特別な例外を設定したいとか、そういう場合に使うんだろうか?
        • deviseとかのログイン機能を提供するgemが、例外の実装をどうしているのか気になりました。
  • @moegi29

    • ルーティング用のヘルパーメソッドを使うことで用途に合わせたルーティングを定義できる。resouecesは複数存在するリソースを扱う場合に使う。:onlyオプションはresouecesとresouece両方で使えるオプション。
    • 例外処理rescue_fromを使うと特定の例外に対する挙動を指定することができる。例外処理、復習したい。
  • @hiromisugie

    • resources: hogesのように1行で基本的なルーティングをまとめて定義できる
    • resourcesの拡張も可能。入れ子にすることでURL構造も階層にできたり、memgercollectionでより複雑な設定ができる(ちゃんとわかってないのでRailsガイドで要復習…!
    • rescure_fromで例外を指定できる→これも理解が浅い、要復習…!
  • @motohiro-mm

    • resourcesはCRUD操作のルーティングができる
      • resourcesのブロック中に設定を書くとリソースの親子関係(入れ子)をルーティングで表現できる
      • membercollectionの使い方をもう一度確認する
    • resourceはindexを除かれる、idもなくなる
    • 例外処理はrescue_fromで自分で定義できる

2023-09-12(火)

ファシリ

@sharoa

ドライバー

@sadanora

読んだところ

2-3-5 「StrongParameters」から
2-4 95p途中まで。
PR: https://github.com/KMZ0209/Perfect_Ruby_on_Rails_Ch2/pull/11

次回

2-4 95p 「renderを省略した場合」から。🚂

学んだこと・感想

  • @sharoa

    • StrongParametersはMass Assignment機能を利用する際に起こりえる脆弱性へ対抗する手段のひとつ。
    • すごく大事そうなやつ。
    • scaffoldで生成されるコードはこのストロングパラメータを利用するようになっているらしい。
  • @sadanora

    • ストロングパラメータ
      • Mass Assignment機能を利用する際に起こり得る脆弱性に対抗する手段のひとつ
        • マスアサインメントは、Rubyのハッシュを使って一括で属性を設定できる仕組み
        • 便利だけど意図しない属性の変更を一般ユーザーに許してしまうことになるので不用意に使えない
      • ストロングパラメータによって想定しないパラメータを利用しないよう制限することで、安全にデータの更新ができる
  • @moegi29

    • MassAssignment:Rubyのハッシュを使って一括で属性を設定できる便利な仕組み。
    • StrongParameter:MassAssignmentで利用しても良いハッシュのキーを許可リストとして定義しておくことで想定していないパラメータの利用制限をするもの。
    • レンダリング方法にはいくつかある。renderメソッドが一番簡単なレンダリング方法
  • @hiromisugie

    • ストロングパラメーターとは、脆弱性に対抗するためのもの。Mass Assignmentで利用しても良いHashのKeyを許可リストとして定義することで、想定していないパラメーターを利用しないように制限できる。
    • 許可リストは、privateメソッドを作成してそこで明示的に許可するキーを設定する。
    • scaffoldは自動的にストロングパラメーターを設定してくれるが、後からカラムを追加したときにストロングパラメーターも一緒に追加できているか確認した方が良い
    • renderメソッドは、最も簡単なレンダリングの方法。下記のようにすればapp/views/books/show.html.erbを描画してくれる
def show
  render  :show
end
  • @cellotak

    • ハッシュを使って一括で属性を設定できることは知っていたが、それがMass Assignment機能というものだということを知った
    • StrongParametersはMass Assignmentで利用してもよいHashのkeyを許可リスト
      として定義して、想定していないパラメータを利用しないように制限する
    • scaffoldで生成されるコードではStrongParametersが明示的に利用されているっぽい
    • 明示的に書いてくれていないのがdeviseでUserモデルを作ったときの話でした
  • @motohiro-mm

    • StrongParametersは想定していないパラメータを利用しないよう制限するための機構
      • require:リクエストに必要なキーを設定(例::user
      • permitrequireの中で受け付けても良いキーを設定(例::name:emailなど)
    • requireに指定したパラメータがparamsに含まれていなかった場合は、ActionController::ParameterMissing例外が発生
    • renderはapp/views/コントローラ名/アクション名.html.erbを検索する

2023-09-13(水)

ファシリ

@sadanora

ドライバー

@hiromisugie

読んだところ

2-4 95p 「renderを省略した場合」から
2-4-2 100pの途中まで。
PR: https://github.com/KMZ0209/Perfect_Ruby_on_Rails_Ch2/pull/12

次回

2-4-2 100p 「variantsによるテンプレートの切り替え」から。🚂

学んだこと・感想

  • @sharoa

    • コントローラのアクション内でrenderの記述の省略が可能。省略した場合、暗黙的にrender アクション名と解釈される。
    • コンテンツのタイプによって表示を出し分けできる。
    • maimuさんがいると🍒本の時にもあった安心感が倍増しますw
  • @sadanora

    • respond_toを使ってhtmljsonなど返すコンテンツの出しわけができる。
    • renderメソッドのオプションは、htmlとjsonくらいしか見たことがないけどfileとかinlineとか色々あるんだなーと思いました。
  • @moegi29

    • RailsはHTML以外にもJSONやXMLなどのフォーマットでも表示できる、その場合はrespond_toブロックで出しわける。
    • prefixの値+_pathはbin/rails routesで確認できる。
    • maimuさんが飛び入り参加!😍siroさんも後から参加してくれてうれしかったです✨またぜひ~!
  • @hiromisugie

    • コントローラのアクション内でrenderを省略すると、暗黙的にrender アクション名と解釈される
    • コンテンツのタイプによっての出し分けの話、scaffoldだとhtmljsonが自動的に設定されているが、jsonで出すケースも結構あるということなのだろうか?(まだjsonを活用したことがないので、邪魔だなと思ってしまう😅 RailsのAPIモードとかで活躍するのかな?)
    • 部分テンプレート、render 'form', task: @taskで_formのパーシャルを呼び出せる
    • layoutテンプレートで特定のレイアウトを指定する場合は、renderメソッドのオプションで指定できる。例:{ render :show, layout: "awesome_book" }
    • ドライバー、ちょっと久しぶりで緊張しました。経験できてありがたいです🙏
  • @cellotak

    • respond_toブロックを使ってコンテンツタイプによって表示を出しわけることができる
    • renderにはメソッドが色々あるみたいだが、使いどころがイメージできてない
    • ビューテンプレート内でrenderを使うことでパーシャルを利用することができる
      • render formとすると、_formという名前のテンプレートが読み込まれる
    • redirect_to @bookは実際にはbook_pathというヘルパーメソッドを呼び出してリダイレクトが行われていて、redirect_to book_path(@book)と同義になる (Railsマジックだ、、)
    • render :show, layout:"awesome_book"と記述することで特定のレイアウトを指定する事ができる (実際に確かめられてよくわかりました)
  • @motohiro-mm

    • renderにオプションをつけることでいろんな表示の仕方ができる
      • 部分テンプレートは_で始まる
      • layoutテンプレートを利用する場合は、app/views/layoutsの中にテンプレートを作る
    • Prefixの値、というのはrails rautesの左側に出てる部分。それを利用してredirect_toのURLのパス部分を生成できる。
  • maimux2x

    • 飛び入りしました!輪読会いいな〜

2023-09-14(木)

ファシリ

@motohiro-mm

ドライバー

@cellotak

読んだところ

2-4-2 100p 「variantsによるテンプレートの切り替え」から
2-5 103p 途中まで。
PR:https://github.com/KMZ0209/Perfect_Ruby_on_Rails_Ch2/pull/13

次回

2-5 103p 「url_for」から。🚂

学んだこと・感想

  • @sharoa

    • yarn忘れないでおきたい。
    • 条件によってテンプレートを切り替えるvariantsと呼ばれる機能がある。
    • 接続してきた端末によってpcとは別のテンプレートを表示したいときに有効とのこと。
    • 目の前で見せてもらって、感動しました✨
  • @motohiro-mm

    • apprication_controllerにvariantsを設定すると、接続してきた端末によって別のテンプレートを表示できる
    • UserAgentを変えると、iPhoneなどから接続するように表示させることができる
      • UserAgentをデフォルトにして、左上2個目のボタンで設定を変えても接続端末を変えられる
    • Prefix値に_pathで/から始まるパス、_urlでドメインなども含んだ完全なURLをかえす
  • @sadanora

    • valiantsによってテンプレートの切り替えができる
      • UAによって異なるテンプレートを表示するなど
      • chromeのUA廃止説があった気がするので、今後UAどうなるんだろうと思いました。
        • https://ics.media/entry/200729/
          • 廃止というか、これまでのユーザーエージェント文字列は固定化されて、新しいユーザーエージェント判別方法としてUA-CHが提供されてるてこと?
    • URLヘルパー
      • _path
        • ドメインやポートを除いたパスを取得
      • _url
        • ドメインなども含む完全なURL
      • railsコンソールでは、app.edit_profile_pathのようにappオブジェクトを経由するとURLが取得できる
  • @moegi29

    • variantsは条件によってテンプレートを切り替える機能。コントローラー内でrequest.variantに:tabletや:mobileなどを入れると値が設定されてアクセスした端末によって表示が変わる。
    • Prefixの値+_pathとするとルーティングで定義したパスが取得可能。app.edit_profile_urlとするとURLを取得できる。
  • @hiromisugie

    • variantsによるテンプレートの切り替えについて
      • +mobile.erbというような、+を使ったファイル名を初めて知った。
      • PC用ページ、スマホ用ページを別テンプレートとして作れる。ウェブアプリではなくウェブサイトは、最近はレスポンシブデザインで(UserAgentでなく画面幅に応じてCSSで)表示を切り替えているのが一般的というイメージがあるけど、Railsアプリではvariantsによる切り替えは結構活用するものなのだろうか、というのが気になりました。
    • Prefixの値+_pathで、ルーティングで定義したパスを取得できる
  • @cellotak

    • variantsを使うことで接続してきた端末によってPCとは別のテンプレートを表示することができる
      • request.variant:tablet:mobileといった値を入力することでindex.html+tablet.erbindex.html+mobile.erbのように+request.variantの値のテンプレートが選択されるようになる
    • Chromeの開発者ツールでUserAgentを切り替えるとiPhoneからアクセスしたと認識させることができる
      • 左上のtoggle device toolbarというものでも切り替え可能
      • iPhoneだけでなくpixelとかGalaxy等も選べる
    • 初ドライバーでトラブってしまい申し訳ないです!
      • モデル追加したりしてると、データを作るときにトラブる時があるというのは学び

2023-09-15(金)

ファシリ

@moegi29

ドライバー

@hiromisugie

読んだところ

2-5 103p 「url_for」から

PR:

次回

2-5-3 109p 「Slim」から。🚂

学んだこと・感想

  • @sharoa

    • Railsにはビューテンプレートで開発の手助けとなるヘルパーメソッドが用意されている。
       - url_for
       - link_to
       - form_with
       - stylesheet_link_tag/javascript_pack_tag
       - time_ago_in_words
       - number_with_delimiter
       - 独自ヘルパーメソッドの定義
    • エスケープ処理にあったXSSは最近みたシナトラの本にもあって知ってる単語!!と思って少しうれしくなりましたw
  • @sadanora

    • ビューでurl_for link_to form_withなどのヘルパーメソッドを使うと便利
    • 独自ヘルパーをapp/helpers/に置ける。これはどのビューからも呼び出せる。
    • RailsはデフォルトでXSS対策をしている。
      • rawを使えばエスケープせずに出力されるらしいけど、使い所のイメージがわかなかった。
    • 雷がすごかった⚡️
  • @moegi29

    • url_forはパス構築、link_toはaタグを生成、form_withはフォームを構築するヘルパーメソッド。time_ago_in_wordsnumber_with_delimiterは何か作るときに便利そう。
    • 独自ヘルパーメソッドを定義する部分は見ていておもしろかったです。
    • RailsにはXSSに対する対策がフレームワークに組み込まれている。意図的にタグを含んだ文字列をそのまま表示したい場合にはrawというヘルパーメソッドを使う
  • @hiromisugie

    • url_forはパスを構築するためのヘルパーメソッド。
    • link_toはaタグを生成できるヘルパーメソッド。これはviewファイルでよく見かける気がする。
    • form_withはフォームを構築するためのヘルパーメソッド。これもviewで、特にパーシャルの_formで見かける。
    • Railsの時間系のヘルパーメソッドは便利らしい。
    • app/helpers/application.rbに記述することで独自のヘルパーメソッドを作ることができる。
    • RailsではあらかじめXSS対策がされており、Javascriptのスクリプトなどはエスケープ処理される。rawをつけるとエスケープされずJavascriptが実行される。(不用意に使うと危ない気もするので気をつけたほうがよさそう)
    • テンプレートエンジンはerb以外にもhamlとか(今日はまだ読んでないけど)slimとかある。hamlslimは慣れればラクなのだろうけど、なんかerbがわかりやすいなぁと思ってしまう…。
  • @motohiro-mm

    • 独自のヘルパーメソッドを定義するには、app/helpersに定義する
      • アプリ全体で使うものはapplication_helperに、コントローラごとにつかうものは対応するコントローラに書く
    • エスケープ処理はRailsでは自動的に動作する(ちょっとこのへんよく分からないのでもう一度読み返します)
    • テンプレートエンジンにはERB、Haml、Slimがある
      • Hamlは%始まり、-の行はRubyコードを実行する、endがいらない

Select a repo