Ruby on Rails5 速習実践ガイドを読んでの感想
はじめに
Ruby on Railsの学習のためにRuby on Rails5 速習実践ガイドという本を読んでみました。 この本で学んだことや感想をまとめていきたいと思います。
各章の感想
Chapter1 RailsのためのRuby入門
この章では、Rubyの基本的な文法について学習することができました!
nilガード
number ||= 10
上記コードはnumberに値が設定されていればnumberを、numberがnilであれば10を代入するという意味です。
→変数にnilが入っているかもしれない場面で、nilの代わりにデフォルト値を設定するのに役立ちます。
ぼっち演算子
&.
という演算子を用いてメソッドを呼び出すと、レシーバーがnilであった場合でもエラーが発生しなくなります。
&.
の正式名称は「safe navigation operator」であり、&.
の形がひとりぼっちで座っている形に似ていることから「ぼっち演算子」と呼ばれています。
Chapter2 Railsアプリケーションをのぞいてみよう
この章ではRailsアプリケーションの構造について学習することができました!
MVC(model・View・Controller)
UIに関わる部分(ビュー)とアプリケーション固有のデータ処理の扱いの部分(モデル)、モデルやビューを総合的に制御する部分(コントローラ)の 3つに役割を分けて管理しやすくする。
ヘルパーメソッド
ビューで利用可能な便利な機能のこと。
MVCの関係性
MVCの関係性は以下の通り。
Chapter3 タスク管理アプリケーションを作ろう
この章では、コントローラとビューの関係性について学習することができました!
コントローラとビュー
CRUDのアクション設定は以下のように設定を行う。
URL例 | HTTPメソッド | アクション名 | 機能名 | 役割 |
---|---|---|---|---|
/tasks | GET | index | 一覧表示 | 全タスクを表示する |
/tasks/3 | GET | show | 詳細表示 | 特定のidのタスクを表示する |
/tasks/new | GET | new | 新規登録画面 | 新規登録画面を表示する |
/tasks | POST | create | 登録 | 登録処理を行う |
/tasks/3/edit | GET | edit | 編集画面 | 編集画面を表示する |
/tasks/3 | PATCH,PUT | update | 更新 | 更新処理を行う |
/tasks/3 | DELETE | destroy | 削除 | 削除処理を行う |
レンダー(render):アクションに続けてビューを表示させること
リダイレクト(redirect):アクションを処理した直後にビューを表示せず、別のURLへ案内する動き
Flashメッセージ:主にリダイレクトの際に次のリクエストに対して、データを伝えるために用意されている仕組み
Chaper4 現実の複雑さに対応する
この章では、主にモデルのデータ制約や状態制御に関して学ぶことができました!
マイグレーション
1つのマイグレーションは1つのバージョンとして扱われる。
マイグレーションはバージョンを上げるだけでなく、適用を取り消すこともできるため、
バージョンの上げ下げを意識する必要がある
データ内容の制限
制約 | railsでの記方法 |
---|---|
NOT NULL | null: false |
文字カラムの長さ指定 | limit: 文字数 |
一意制約 | unique: true |
コールバック
登録や削除などの重要なイベントの前後に任意の処理を挟む仕組み。
コールバックの種類 | 代表的な使い道 |
---|---|
before_validation | 検証前の値の正規化 |
after_validation | 検証結果(エラーメッセージ)の加工 |
before_save before_create before_update |
saveのために裏側で行いたいデータ準備を行う。 検証エラーを出してもユーザーにはどうすることもできない状態異常を防ぐために例外を出す |
after_save after_create after_update |
そのモデルの状態に応じて他のモデルの状態を変えるなど連動した挙動を実現する 検証エラーを出してもユーザーにはどうすることもできない状態異常を防ぐために例外を出す |
before_destroy | 削除してOKかをチェックし、ダメなら例外を出すなどして防ぐ |
after_destroy | そのモデルの削除に応じて他のモデルの状態を変えるといった連動した挙動を実現する |
セッションとCookie
セッション:
サーバ側にセッションという仕組みを用意して、1つのブラウザから連続して送られている
一連のリクエストの間で、状態を共有できるようにする。
Cookie:
複数のリクエスト間で共有したい状態をブラウザ側に保持する仕組み。
Railsではセッションは以下のようにCookieによってやりとりされるセッションIDをキーにして保管される。
Chapter5 テストをはじめよう
この章では、テストのやり方を学ぶことができました!
テストを書くメリット
テストを書くメリットは以下の7点。
- テスト全体にかかるコストの削減できる
- 変更をフットワーク軽く行えるようになる
- 環境のバージョンアップやリファクタリングを行いやすくする
- 仕様を記述したドキュメントとしても機能する
- 仕様やインターフェイスを深く考えるきっかけとなる
- 適切な粒度のコードになりやすい
- 確実性が高められ、開発効率を上げることができる
テスト用ライブラリ
RSpec
BDD(Behaviour-Driven Development 振舞駆動開発)のためのデスティングフレームワーク。
動く仕様書として自動テストを書くという発想で作られており、要求仕様をドキュメントに記述するような、感覚でテストケースを記述可能。
Capybara
WebアプリケーションのE2E(End to End)テスト用フレームワーク。
FactoryBot
テスト用データの作成をサポートするgemでテスト用データを簡単に用意し、テストから呼び出して利用することが可能。
Chapter6 Railsの全体像を理解する
この章では、ルーティングに関して学ぶことができました!
ルーティングの構成
ルートは以下の5要素で構成されている。
要素名 | 説明 |
---|---|
HTTPメソッド | サーバーへのリクエストの際に指定する。情報の送信・取得の方法を表現する。 |
URLパターン | URLそのものや、 :id のように一部に任意文字が入るようなパターンを指定する。 |
URLパターン名 | 定義したULRパターンごとに一意な名前をつける。 |
コントローラ | 呼び出したいアクションのコントローラクラスを指定する。 |
アクション | 呼び出したいアクションを指定する。 |
図で表現すると以下の通り。
URLパターンに名前をつけ、その名前をもとにURLを簡単に生成するためのURLヘルパーメソッドを作成する。
routes.rbの構造化
メソッド | 説明 |
---|---|
scope | URLパターン名のプリフィクスなどをオプションに指定することで、ブロック内の定義をまとめて制約をかける |
namespace | URL階層、モジュール、URLパターン名に一括で一定の制約をかける |
controller | コントローラを指定する |
国際化
複数の言語を切り替えるためのステップは以下の3ステップです。
セキュリティ強化
Strong Parameters
Strong Paramerters:想定通りのパラメータかどうかをホワイトリスト方式でチェックする機能
params.require(:task).permit(:name, :description)
上記赤字部分は、paramsの:task
の中身を要求し、(なければ例外を出す)
青字部分は、params[:task]から:name
と:description
を取り出すことを表します。
CSRF対策
CSRF(Cross-site request Forgery):
別のウェブサイト上に用意したコンテンツのリンクを踏んだり、
画像を表示したことをきっかけに、ユーザーがログインしているWebアプリケーションに悪意ある操作を行う攻撃。
対策:
同じWebアプリケーションから生じたリクエストであることを証明するためのセキュリティトークンを発行し、
照合することで対策する。
Chapter7 機能を追加してみよう
この章では、機能追加方法について学ぶことができました!
登録や編集の実行前に確認画面をはさむ
画面の遷移は下図の通りです。
手順は以下の通りです。
- 確認画面を表示するアクションを追加する
- 新規登録画面からの遷移先を変える
- 登録アクションで戻るボタンからの遷移に対応する
一覧画面に検索機能を追加する
検索機能を追加する手順は以下の通りです。
- Ransackをインストールする
- ransackメソッドを用いて、検索機能を追加する
- ransackの提供するヘルパー
search_form_for
を用いて、検索用フォームを作成する
メールを送る
メールを送信するためにAction Mailer
という仕組みがある。
追加手順は以下の通り。
- ジェネレータを用いてメーラーを作成する(rails g mailer TaskMailler)
- 通知用メールを送るためのメソッドを追加する
- メールのテンプレートを実装する
- 用意したメーラーをコントローラから呼び出して、実際にメールを送るよう変更する
Chapter8 RailsとJavaScript
この章では、RailsとJavaScriptの関係について学ぶことができました!
AjxaとSJR
Ajax(Asynchronous JavaScript And XML):
Webブラウザ上で非同期通信を行い、ページの再読み込みなしにページを更新する
SJR(Server-generated JavaScript Response):
サーバサイドで生成したJavaScriptからなるレスポンスのこと
Turbolinks
a要素のクリックイベントをフックとして遷移先のページをAjaxで取得する。
取得したページが要求するJavaScriptやCSSが現在のものと同一であれば現在のものをそのまま使用し、
title要素やbody要素のみを置き換える。
→リクエストごとにJavascriptやCSSをブラウザが評価しなくなるため、パフォーマンスが向上する。
注意点
- ブラウザのページ遷移が発生しないことが多くなる
<script>
はhead要素内に記述する
JavaScript管理
Yarn:Facebook社によって開発されたJavaScriptのパッケージマネージャ
Webpacker:
JavaScriptのビルドツール「Webpack」のラッパーであり、RailsアプリケーションでWebpackを使ってJavaScriptを管理することを簡単にしてくれるGem
Chapter9 複数人でRailsアプリケーションを開発する
この章では、複数人開発でのアプリケーション管理について学ぶことができました!
マイグレーションの管理における注意事項
スキーマキャッシュ
スキーマキャッシュ:
テーブルのスキーマを毎回データベースに問い合わせにいくことによるパフォーマンス低下を防ぐための機能。
スキーマキャッシュが古いと反映されず、古いままの値が出力される場合があるので、
手動でキャッシュを更新しなければならないケースがある。
Chapter10 Railsアプリケーションと長く付き合うために
この章では、バージョンアップやリファクタリングについて学ぶことができました!
バージョンアップ
バージョンアップ時に検討すべき内容は以下の通りである。 - 自動テストは十分か - 動作確認方法 - リリース方法 - リリース後の動作確認と監視方法 - 万が一のときのロールバック方法
複雑性への対応
複雑性へ対応するには以下の3つの鍵ある。
しかるべきところにコードを書く
→モデルに書くべきコード(ビジネスロジックなど)をモデルに寄せる上手に共通化する
→共通機能のモジュールをMix-inしたり、継承や抽象を用いて共通化を行う
上記「しかるべきところにコードを書く」を行ってから共通化を行う必要あり新しい構造を追加して役割分担をする
→共通処理を担当するオブジェクトを作成したり、外部サービスのロジックをオブジェクトに閉じ込めることで役割を分担する
全体の感想
- Rubyの言語仕様から実際の運用まで説明されており、実際のアプリケーションの流れをイメージすることができた
- 随所にコード例やモデル図などが用いられており、比較的理解しやすかった
- Ruby on Railsのことが広く網羅されているので辞書のような形で使用するのもありだなと感じた