『パーフェクトRuby on Rails』学習メモ
Part1 Rails overview
Ch01 Ruby on Railsの概要
- Rakefile
- rake -T : タスク一覧
- rake (taskname) : タスク実行
- bundle
- gem packageを束ねる
- Gemfileが作られる.
- Railsの思想
- Web application開発のためのframework
- CoC(Convention over Configuration)
- 設定より規約
- 規約により設定が不要になる.
- DRY
- REST(REpresentational State Transfer)
- 自動テスト
- まとめ
- Railsをはじめよう
- rails new (project name)
- 重要なファイルなど
- binstubファイルとして,binにbundle exec省略可能なコマンドを置いている.
- MVC architectureとして,appディレクトリ以下にmodels, views, controllers + Viewで使うhelpers + assets for frontend + others
- rails s: Web applicationを起動. s: server
- libは,独自に実装したRakeタスクなどを配置するのみ.かつては,独立性の高いコードを置く運用もあった.
- よく使うrailsコマンド
- routes: display routing information
- runner: 処理を明確にするため,Rakeとは個別のコマンドとして用意された単体スクリプトの実行
- rails new (project name)
- scaffold(足場)
Ch02 Ruby on RailsとMVC
目的
内容
- MVC architecture
- Model
- DBとの接続とデータに対する操作,およびビジネスロジック
- View
- Modelの内容を参照し,視覚表現を行う
- Controller
- Modelのロジック呼び出し,必要なViewの選択など,ModelとViewをつなぐ部分
- モデルの基礎と考え方
- modeling: システムを作ることは,解決する問題に対して必要な概念を探して,命名・関係性の整理を行うこと.
- ActiveRecordでのmodelのimplementation
- ActiveRecordでのmodelの役割
- DBのrecordとActiveRecord objectを結びつける
- ActiveRecordの内部のActiveModelというモジュールにより,ビジネスロジックの実装的な振る舞いの部分を実行する.
- ActiveRecordでのmodelの役割
- modelとCRUDとの対応.
- Model
- modelを扱う
- modelを通じた検索
- ActiveRecord::Relationクラスについて
- ActiveRecordのQuery Interfaceによる操作結果をオブジェクトとして表現するもの
- SQLの情報を保持し,実際に必要になったときのみDBにアクセス.
- 明示的にSQLを発行するときは,to_a method
- Scopeで,よく使う検索条件をまとめて命名
- nilを返す必要があるときはクラスメソッドで定義する方が〇
- default_scopeは安易には使えない
- ActiveRecord::Relationクラスについて
- model同士のrelation
- 関連付け
- SQLite3のための対応必要.
- has_many, has_one, belong_to
- 多対多
- 中間テーブルが必要.
- 関連付け
- dataの更新
- create, save
- validation
- !をつけるとvalidation失敗時に例外発生
- callback
- callbackpoint
- enum
- !, ?
- modelを通じた検索
- controllerの役割
- hook
- CSRF(Cross Site Request Forgeries)対策
- resources routing
- exception
- rescue_from
- StrongParameters
- Mass Assignmentで利用できるHashのkeyの許可リストを定義する
- 権限の扱いなど
- controllerとviewの協調と,view templateの基本
- renderingまでの流れ
- contentsのtypeに合わせる
- respond_to
- redirect_to
- 部分テンプレート, layout
- variantsによるtemplateの切り替え
- about view template
- Prefixの値 + _path で,routingで定義したpathを取得できる
- _urlでは,ドメインなども含んだ完全なURL
- helper methodの活用例
- url_for
- link_to
- form_with
- stylesheet_link_tag, javascript_pack_tag
- その他
- 独自メソッド定義
- app/helpers
- escape 処理
- XSS対応
- そのまま表示 → raw
- XSS対応
- template engine
- API server として振る舞うときのviewについて
- Prefixの値 + _path で,routingで定義したpathを取得できる
まとめ
- Model層について,ActiveRecordの基本的な操作,validation,callback
- Controller層について,ModelとViewをつなぐこと,request objectやaction callback,脆弱性への対処
View層について,受け取ったModelを表示すること,template engine, helper method,様々なformatでの表示
applicationの主要なlogicはなるべくModelに書くべき
- Fat Modelへの対応必要.
Ch03 Railsのbasic機能
- testの種類と実行方法
- RackとRailsの関係
- Rack: Web application serverとWeb application frameworkの中間において,interfaceを共通化した仕様・実装
- 疎結合なやり取りを行えるようにするもの
- Rack application: call methodから受け取ったHTTP request dataなどを元にresponceとして返す内容を決定し,call methodの戻り値とするもの
- Rack middleware
- middlewareは,initializeで後続として処理していくapplication(or middleware)のオブジェクトを受け取り,自身のcall methodが呼ばれたときにinitializeで受け取ったオブジェクトのcall methodを呼ぶことで,後続処理を行うという流れ.
- Pylonsの説明にある玉ねぎの図
- config内で,使用の有無を管理
- middlewareの上下関係の設定もできる
- Rack: Web application serverとWeb application frameworkの中間において,interfaceを共通化した仕様・実装
- DBの管理
- 秘密情報の管理
- versionごとに管理方法が異なる
- より開発プロセスにあった形になっている.
- HTTPとRails application
- Early Hints
- 200 OKの前に,103 Early Hints
- HTMLのパース中にアセットのロード可能
- 200 OKの前に,103 Early Hints
- CSP(Contents Security Policy)
- config/initializers/content_security_policy.rb
- nonce
- strict-dynamic
- Early Hints
Part 2 Railsの周辺知識
Ch04 frontendの開発手法
- Railsで利用するエコシステムの軸をfrontend開発の標準的な仕組みに移している.
- JSを管理
- CSSや画像の管理
- 自動ビルド
- ビルド方法の切り替え
- libraryの統合
- plugin, loaderの追加
- CSSの管理
- 控えめなJS framework
- Stimulus: 規約をもたらすframework
- server sideにbusiness logicの実装が寄る
- HTMLはサーバから返す
- server sideとfrontendを合わせたトータルの工数が少ない
- frontendで表現できる幅が狭まる
- server sideにbusiness logicの実装が寄る
- Stimulus: 規約をもたらすframework
Ch05 Rails標準の機能を活用して素早く機能実装する
- Active Jobによる非同期実行
- mail sending, data集計→CSVファイル作成などの時間がかかる処理に使う
- 実装,キュー,引数,バックエンドの設定,複数キューの管理,ジョブの例外処理,ジョブのテスト
- Active Storageによるファイルアップロード
- 動作,設定
- サムネイルの生成
- access制限
- direct upload
- helperの不足
- cacheの不足
- Action Mailerによるメール送信
- 使い方,動作確認
- 設定
- test
- Action Mailerによるメール受信
- 対応サービス
- 事前準備
- projectの作成
- 処理の流れと実装手順
- test
- Action TextによるRich text 機能
- 使い方
- N+1問題
- customize
- Action Cableによるreal time通信
- web socketを使ったリアルタイム処理
- chat serviceの作成
- config
- 認証
- worker数の設定
- UT
Part3 Web Application development
Ch06 Rails application development
- Railsの機能をいつどのように使うか,一般的なWeb applicationを開発する際に気を付けるべきポイントを見る
- event notify applicationを作る
- applicationの作成と下準備
- OAuthを利用して「GitHubでログイン」機能を作る
- GitHub applicationの登録
- ログインのための機能の作成
- user model作成
- ログイン処理の作成
- ログアウト処理の作成
- event registration機能の作成
- eventの閲覧機能を作る
- l: localize
- eventの編集・削除機能を作る
- 関連を利用する
- 登録されたeventへの参加機能,参加キャンセル機能を作る
- 退会機能を作る
- 基本の7つ以外のアクションを作りたくなったら別のコントローラを作る.
- おわりに
- なぜこのような機能があるのかが重要
Ch07 Rails applicationの test
- test codeをどう書いていくか
- minitest, RSpec
- test data作成
- factory_bot
- sequenceで,固定値を回避
- 乱数を同じにする場合はseedをオプションで指定する.
- factory_bot
- system test
- 環境の問題の解決が必要@wsl2
- controller test
- 権限のテスト
- viewのテストはシステムテストで集約することが多い
- model test
- stub, mock
- ランダムな値で都合のいいデータを回避
- validationのテストの扱い
Part4 Rails applicationの拡張・運用
Ch08 Rails application 拡張
- file upload機能の作成
- libvipsを使う
- direct upload時のvalidationは注意点アリ
- gemで機能拡張する
- Kaminari: pagenation
- searchkick
- https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html
- 単純な検索はGET, 複雑な検索フォームならPOST
- その他の機能
- error handling
- rescue_fromは後に登録したものから順番に判定
- Rack Middlewareを使ったerror handling
- 独自の例外でpublic/500.html以外を表示したい場合に設定する
- dynamic error pageのdemerit
- routingの制限
- error handling
- gemの選定
Ch09 コードの品質を上げる
- CI
- GitHub actions
- Elasticsearchとplugin
- GitHub actions
- gemの定期更新
- Dependabot
- static analysis
- coverage測定
- SimpleCov
- Coveralls
- Application Performance Measure(APM)
- Skylight
- rack-mini-profiler
- localで手軽に動かせる
Ch10 containerを利用したRails applicationの運用
- Rails applicationのinfrastructure概要
- Infrastructure as Code → Docker
- Disposable
- 基本的なDocker imageの構築
- 開発環境におけるDockerの活用
- ホストマシン上のdirectoryをコンテナ上にマウント
- docker-compose
- 環境によって可変する設定値や秘匿情報の管理
- log出力
- stdout
- error tracking
- 外部サービスをuse
- HTTP serverとの通信
- nginxなど,速さ,扱いやすさなどで必要
- Herokuのガイドなど
- kubernetesについて
Part5 expert Rails
Ch11 複雑なドメインを表現する
- architecture patternから見るRails
- domain modelとActiveRecord
- RailsではデータストアにRDBを想定
- ActiveRecordというarchitecture patternを用いて,DBのレコードとオブジェクトを対応付け
- RailsではデータストアにRDBを想定
- what's ActiveRecord
- 単一table継承
- あるクラスから派生するすべてのサブクラスを1つのtableに対応させる
- type columnで,各レコードがどのクラスに属するか識別
- 扱いがほかのカラムと異なる
- type columnで,各レコードがどのクラスに属するか識別
- 継承の是非の検討が必要
- あるクラスから派生するすべてのサブクラスを1つのtableに対応させる
- domain modelとActiveRecord
- value object
- entity: 属性の値にかかわらず一意に識別
- 値objectに切り出す
- composed_of
- service object
- 複数のobjectを組み合わせて表現するとき
- eventで表現できる場合はeventで表現する
- test doubleを使えないdemeritあり
- 実装rule, interface
Ch12 複雑なUCを実現
- UCとmodel
- DBと紐づかないmodelを作る
- UCのlogic の分離
- ActiveModel
- DBに紐づかないmodel
- Attributes, Callback
- Serialization
- attributes
- Validations
- Model
- controller, viewのメソッドでobjectを使えるようにする
- form object
- UC logicを実装するobject, application serviceやInteractor, にform_withとの連携に必要なIFを持たせたもの
- Userとのやり取りに用いるformを簡単に実装できる
- 共通のvalidation ruleの定義
- UC logicを実装するobject, application serviceやInteractor, にform_withとの連携に必要なIFを持たせたもの
- presenter
- view helperの問題点への対応
- a.c.a. Decorator
- ActiveDecorator
Ch13 複雑なデータ操作を実装する
- Concern
- data 操作に関するlogicの実装と関連付けの宣言を行うlayer
- ActiveSupport::Concern
- included, class_methods, module間の依存関係解決
- @routing
- Callback Object
- 実装方針
- 更新系はCallback Object
- for test
- 参照系には利用できない
- 更新系はCallback Object
- 実装方針