よっぴブログ

【技術書メモ2】パーフェクト Ruby on Rails

f:id:yoppi-y:20190414125344j:plain



 

 

1章 Ruby on Railsの概要

 
Bundlerはgemパッケージの仕組みを進化させ、「開発しているプロジェクト内でどのgemパッケージを使っているのか」、そして「どのバージョンを使用しているのか」ということを明示する仕組みを提供する。
 

・CoC (Convention over Configuration)  設定より規約

設計を設けることにより非常にシンプルになり、本来注力すべきビジネスロジックの実装だけを考えることができるようになる。

・DRY (Don’t Repeat Yourself)  同じことを繰り返さない

DRY原則を守ることにより、変更が生じた際に何箇所もコードを修正することがなくなり、メンテナンス性が高まる。

・REST (Representation State Transfer)  すべてのリソースに一意となる識別子がある

リソースを中心に考えると、機能追加のしやすい自然な設計になる。
 
自動テストとは
RubyRailsでは自動テストを行う文化を重要視している。デフォルトではMinitestが選択されているが、よく利用されてるRSpecを利用するように設定することもできる。
 
 

2章 Ruby on RailsMVC

 
・M = Model
データベースとの接続とデータに対する操作、およびビジネスロジック
・V = View
Modelの内容を参照し視覚表現を行う部分
・C = Controller
Modelロジックを呼び出し、必要なviewの選択など、ModelとViewをつなぐ部分
 
モデルの役割
データベースと接続し、データベースのレコードとエンティティを結びつける。
※エンティティとは、対象物のまとまりのこと。データベースを設計する際に、人・物・事象・概念・サービスといった対象物を同一のカテゴリーでまとめたもののこと。
ビジネスロジックの実装的な振る舞いに関するところ、すなわちバリデーションや様々なコールバックを実行するところ。
※コールバックとは、レコードを作成して保存する一連の流れの間の様々な箇所で、任意の処理を埋め込む。こういった特定の処理を呼びだすこと。
 
コントローラーの役割
リクエストからコントローラーとアクションを決定し、アクションの中でモデルを通じてデータを取得・加工する。最後にそのデータをビューに渡してレンダリングを指示することで、Webアプリケーションの画面をユーザーに返す役割を担っている。
例外処理を行う。
 
ビューの役割
情報についてユーザが最終的に認識可能な形にするところ。
 
Railsのテンプレートエンジンについて
・ERB
Rubyに標準添付されているテンプレートエンジンで、Railsでも標準のテンプレートエンジンとして採用されている。
ERBの見た目はHTMLとほぼ同じ。そのため、既存のHTMLなどがある場合はそのまま利用できる。
Rubyの構文を使用する場合は<% %> <%= %>を使用する。
Haml
HTMLの構造を非常にシンプルなインデントで表現したテンプレートエンジン。Railsの標準機能ではないが、gemパッケージとしてインストールできる。
・Slim
Hamlと同じようにインデントベースのテンプレートエンジンだが、Hamlよりもさらに簡潔な表記ができ、なおかつ高速。
 

3章 アセット

 
Webアプリケーションの直接のレスポンスではない構成要素をアセットと呼ぶ。RailsにはPipelineという仕組みがあり、簡単にアセットを扱えるようになっている。
 
Sprockets(アセットパッケージングツール)の概要
・アセットファイルにアクセスするためのパスを管理させる
・アセットのコンパイル
・アセットファイルどうしの依存性を管理する
Sprocketsはアセットファイルを配置するパスを管理して1つのディレクトリにあるかのようにアクセスする機能を提供している。
 
CoffeeScriptJavaScriptコンパイルされるRubyPythonによく似た言語。
よりモダンな構文と便利な機能を利用してJavaScriptを記述できる
Rubyと構文が近いことから最近のRails開発ではよく使われている
 
Turbolinks
TurbolinksはJavaScriptCSSに変化が無いなら、タイトルとbodyだけ差し替えることでJavaScriptCSSの読み込みを省略し高速化できる、という発想の下に成り立っている。大まかには以下のフローに従っている。
・ページ内のクリックイベントを補足し、それがAタグに対するクリックだった時、Turbolinksによる遷移を実行する。
・TurbolinksはAjaxによるリクエストを実行し、リンク先のHTMLを取得する。
・取得したHTMLのタイトルとbodyタグの中身を抽出する
・現在のページのタイトルとbodyタグを抽出したものと入れ替えて更新する
・window.history.pushStateを実行し、参照しているURLをリンク先のURLに更新する
Turbolinksが実行されるのはGETメソッドによって遷移するリンクだけ
 

4章 Railsのロードパスとレイヤーの定義方法 

MVCに当てはまらないようなモジュールの管理方法
・モデルとして扱う
・libディレクトリで管理する
・新しいレイヤーを定義する
 
あらかじめRailsに用意されている、ライブラリを配置するためのディレクトリ。
独自に定義したRakeタスクを配置しておく場所
 
レイヤー
同種の機能を持ったクラスをいくつか定義したい場合、その機能を司るレイヤーを新しく追加しても良い。

5章 開発を効率化するgem

gem 'pry-byebug’ 
Pryはirbをより高機能にしたREPL環境(ユーザーとインタプリタが対話的にコードを実行すること)。irbのように単体のコマンドとして利用可能になる。
 
gem ‘hirb’
gem 'hirb-unicode
コンソール上でのモデル情報の出力結果を、表形式の出力結果に整形することができる。
 
gem ‘spring'
springとは⇨railsコマンド実行時にspringコマンドを追加することで、初期起動時のデータなどを読み込むspringサーバが起動する。2回目以降はこのspringサーバを経由することでrailsコマンドが処理を開始する時間が高速化する。
springはgemパッケージとして提供されており、インストールすることでspringコマンドが実行可能となる。
 
gem 'rails-erd'
モデルの情報からER図のPDFなどを出力できる。
 

6章 Railsアプリケーション開発

rails new をするときに、-TオプションつけるとTest::Unit用のファイルが生成されないようになる。RSpecを使うときはこのオプションを使用。
 
OAuthとは?
三者となるアプリケーションに対して安全にアクセス権限を提供するためのプロトコル。最近では「Twitterログイン」「facebookログイン」など、認証の手段としても広く使われている。
 
gemについて
・gemのバージョンの取り扱いは、次の例のように様々なポリシーが採用されている
・常に新しいバージョンを使う
・リリース時までは定期的に新しいバージョンにアップデートするが、リリース時に固定する
・リリース時のバージョンで一旦固定するが、定期的にバージョンを見直す
 

7章 Railsアプリケーションのテスト

なぜテストコードを書くのか
テスト対象となる仕様とアプリケーションの設計を考える機会が増える
(仕様の抜け漏れを減らすことができる)
(きれいな設計にできる)
・手作業によるテストを減らすことができる
・「ここはちゃんと想定通りに動くだろうか…」という不安を減らせる
リファクタリングや仕様の変更に自信を持って対応できる
 
モデルのテスト
・各メソッドが期待通りの値を返すか
・各メソッドが期待通りの副作用をもたらしているか
・バリデーションが正しく設定されているか
 
コントローラーのテスト
アクションがビューに渡すインスタンス変数に期待通りのオブジェクトを代入しているか
アクションが期待通りのステータスコードを返しているか
アクションが期待通りのテンプレートを選択しているか
 

8章 Railsのインフラと運用 

DevOps
Dev:アプリケーション開発者
Ops:運用・インフラ担当エンジニア
DevOps⇨DevとOpsが歩み寄る
 
アプリケーションの構成
・ウェブサーバ
ブラウザなどからのリクエストを一番最初に受け取るサーバ。凡用的なHTTPサーバを用いることも多く、場合によってはキャッシュ、アクセス制限、ヘッダーやリクエストの書き換えなどもこのレイヤーで行う。
Railsのアプリケーション自体をホストするサーバ。
・データベース
Railsのバックエンドに利用するデータベースとしては、SQLitee3、MySQLPostgreSQLなどがあります。このうち、MySQLPostgreSQLは別途サーバプロセスを立ち上げる必要がある。
アプリケーションが大きくなった場合の安定性という点では、MySQLPostgreSQLを利用してサーバ型のデータベースを用いたほうが有利。
 

9章 より実践的なモデルの使い方

Concern
日本語で関心ごとという意味で、開発者がひとまとまりの概念として捉えたい物事を指す。つまり、Concernモジュールとは開発者の関心ごとをまとめたモジュールということになる。
中でも、複数のモデルや機能に跨がって影響するようなものを、横断的関心ごとといい、以下のような例がある。
・アプリケーション全体で利用されるロギング機能
・変更に対する証跡の記録
・タグによる分類機能
・データの論理削除や、有効化・無効化処理
・他のサービスやバックエンドプロセスと連携するためのシリアライズ
 
サービスクラス
「コントローラ」と「モデル」の中間のイメージ。
コントローラがユーザーからのリクエストを呼び出すインターフェースであり、サービスがモデルが行う処理を取りまとめて実行するためのインターフェースになる。
 

10章 Railsを拡張する

Railsを拡張するgemの作り方は大きく分けて3つある
・RackMiddlewareを作る
・Railtieの仕組みを利用する
・その他、コマンドラインツールなどを作る
 
Rack
たくさんのアプリケーションサーバとたくさんのRubyフレームワークとをつなぐ規約
Webサーバ実装とアプリケーションフレームワークの実装との中間に存在し、お互いの差異を吸収するような規約のひとまとまり。