【技術書メモ2】パーフェクト Ruby on Rails
- 1章 Ruby on Railsの概要
- 2章 Ruby on RailsとMVC
- 3章 アセット
- 4章 Railsのロードパスとレイヤーの定義方法
- 5章 開発を効率化するgem
- 6章 Railsアプリケーション開発
- 7章 Railsアプリケーションのテスト
- 8章 Railsのインフラと運用
- 9章 より実践的なモデルの使い方
- 10章 Railsを拡張する
1章 Ruby on Railsの概要
Bundlerはgemパッケージの仕組みを進化させ、「開発しているプロジェクト内でどのgemパッケージを使っているのか」、そして「どのバージョンを使用しているのか」ということを明示する仕組みを提供する。
・CoC (Convention over Configuration) 設定より規約
設計を設けることにより非常にシンプルになり、本来注力すべきビジネスロジックの実装だけを考えることができるようになる。
・DRY (Don’t Repeat Yourself) 同じことを繰り返さない
DRY原則を守ることにより、変更が生じた際に何箇所もコードを修正することがなくなり、メンテナンス性が高まる。
・REST (Representation State Transfer) すべてのリソースに一意となる識別子がある
リソースを中心に考えると、機能追加のしやすい自然な設計になる。
自動テストとは
2章 Ruby on RailsとMVC
・M = Model
データベースとの接続とデータに対する操作、およびビジネスロジック
・V = View
Modelの内容を参照し視覚表現を行う部分
・C = Controller
Modelロジックを呼び出し、必要なviewの選択など、ModelとViewをつなぐ部分
モデルの役割
データベースと接続し、データベースのレコードとエンティティを結びつける。
※エンティティとは、対象物のまとまりのこと。データベースを設計する際に、人・物・事象・概念・サービスといった対象物を同一のカテゴリーでまとめたもののこと。
ビジネスロジックの実装的な振る舞いに関するところ、すなわちバリデーションや様々なコールバックを実行するところ。
※コールバックとは、レコードを作成して保存する一連の流れの間の様々な箇所で、任意の処理を埋め込む。こういった特定の処理を呼びだすこと。
コントローラーの役割
リクエストからコントローラーとアクションを決定し、アクションの中でモデルを通じてデータを取得・加工する。最後にそのデータをビューに渡してレンダリングを指示することで、Webアプリケーションの画面をユーザーに返す役割を担っている。
例外処理を行う。
例外処理を行う。
ビューの役割
情報についてユーザが最終的に認識可能な形にするところ。
Railsのテンプレートエンジンについて
・ERB
ERBの見た目はHTMLとほぼ同じ。そのため、既存のHTMLなどがある場合はそのまま利用できる。
Rubyの構文を使用する場合は<% %> <%= %>を使用する。
・Haml
HTMLの構造を非常にシンプルなインデントで表現したテンプレートエンジン。Railsの標準機能ではないが、gemパッケージとしてインストールできる。
・Slim
3章 アセット
Webアプリケーションの直接のレスポンスではない構成要素をアセットと呼ぶ。RailsにはPipelineという仕組みがあり、簡単にアセットを扱えるようになっている。
Sprockets(アセットパッケージングツール)の概要
・アセットファイルにアクセスするためのパスを管理させる
・アセットのコンパイル
・アセットファイルどうしの依存性を管理する
Sprocketsはアセットファイルを配置するパスを管理して1つのディレクトリにあるかのようにアクセスする機能を提供している。
よりモダンな構文と便利な機能を利用してJavaScriptを記述できる
Turbolinks
TurbolinksはJavaScriptやCSSに変化が無いなら、タイトルとbodyだけ差し替えることでJavaScriptやCSSの読み込みを省略し高速化できる、という発想の下に成り立っている。大まかには以下のフローに従っている。
・ページ内のクリックイベントを補足し、それがAタグに対するクリックだった時、Turbolinksによる遷移を実行する。
・取得したHTMLのタイトルとbodyタグの中身を抽出する
・現在のページのタイトルとbodyタグを抽出したものと入れ替えて更新する
・window.history.pushStateを実行し、参照しているURLをリンク先のURLに更新する
Turbolinksが実行されるのはGETメソッドによって遷移するリンクだけ
4章 Railsのロードパスとレイヤーの定義方法
MVCに当てはまらないようなモジュールの管理方法
・モデルとして扱う
・libディレクトリで管理する
・新しいレイヤーを定義する
libディレクトリ
独自に定義したRakeタスクを配置しておく場所
レイヤー
同種の機能を持ったクラスをいくつか定義したい場合、その機能を司るレイヤーを新しく追加しても良い。
5章 開発を効率化するgem
gem 'pry-byebug’
gem ‘hirb’
gem 'hirb-unicode’
コンソール上でのモデル情報の出力結果を、表形式の出力結果に整形することができる。
gem ‘spring'
springとは⇨railsコマンド実行時にspringコマンドを追加することで、初期起動時のデータなどを読み込むspringサーバが起動する。2回目以降はこのspringサーバを経由することでrailsコマンドが処理を開始する時間が高速化する。
springはgemパッケージとして提供されており、インストールすることでspringコマンドが実行可能となる。
gem 'rails-erd'
モデルの情報からER図のPDFなどを出力できる。
6章 Railsアプリケーション開発
OAuthとは?
gemについて
・gemのバージョンの取り扱いは、次の例のように様々なポリシーが採用されている
・常に新しいバージョンを使う
・リリース時までは定期的に新しいバージョンにアップデートするが、リリース時に固定する
・リリース時のバージョンで一旦固定するが、定期的にバージョンを見直す
7章 Railsアプリケーションのテスト
なぜテストコードを書くのか
テスト対象となる仕様とアプリケーションの設計を考える機会が増える
(仕様の抜け漏れを減らすことができる)
(きれいな設計にできる)
・手作業によるテストを減らすことができる
・「ここはちゃんと想定通りに動くだろうか…」という不安を減らせる
・リファクタリングや仕様の変更に自信を持って対応できる
モデルのテスト
・各メソッドが期待通りの値を返すか
・各メソッドが期待通りの副作用をもたらしているか
・バリデーションが正しく設定されているか
コントローラーのテスト
アクションがビューに渡すインスタンス変数に期待通りのオブジェクトを代入しているか
アクションが期待通りのステータスコードを返しているか
アクションが期待通りのテンプレートを選択しているか
8章 Railsのインフラと運用
DevOps
Dev:アプリケーション開発者
Ops:運用・インフラ担当エンジニア
DevOps⇨DevとOpsが歩み寄る
アプリケーションの構成
・ウェブサーバ
Railsのアプリケーション自体をホストするサーバ。
・データベース
Railsのバックエンドに利用するデータベースとしては、SQLitee3、MySQL、PostgreSQLなどがあります。このうち、MySQL、PostgreSQLは別途サーバプロセスを立ち上げる必要がある。
アプリケーションが大きくなった場合の安定性という点では、MySQLやPostgreSQLを利用してサーバ型のデータベースを用いたほうが有利。
9章 より実践的なモデルの使い方
Concern
日本語で関心ごとという意味で、開発者がひとまとまりの概念として捉えたい物事を指す。つまり、Concernモジュールとは開発者の関心ごとをまとめたモジュールということになる。
中でも、複数のモデルや機能に跨がって影響するようなものを、横断的関心ごとといい、以下のような例がある。
・アプリケーション全体で利用されるロギング機能
・変更に対する証跡の記録
・タグによる分類機能
・データの論理削除や、有効化・無効化処理
・他のサービスやバックエンドプロセスと連携するためのシリアライズ
サービスクラス
「コントローラ」と「モデル」の中間のイメージ。
コントローラがユーザーからのリクエストを呼び出すインターフェースであり、サービスがモデルが行う処理を取りまとめて実行するためのインターフェースになる。
10章 Railsを拡張する
Railsを拡張するgemの作り方は大きく分けて3つある
・RackMiddlewareを作る
・Railtieの仕組みを利用する
・その他、コマンドラインツールなどを作る
Rack
Webサーバ実装とアプリケーションフレームワークの実装との中間に存在し、お互いの差異を吸収するような規約のひとまとまり。