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ステップです。

  1. 利用するロケールに対応する翻訳データのymlファイルをconfig/localesの下に配置
  2. 現在のロケールを示すI18n.localeが正しく設定された状態にする
  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 機能を追加してみよう

この章では、機能追加方法について学ぶことができました!

登録や編集の実行前に確認画面をはさむ

画面の遷移は下図の通りです。

手順は以下の通りです。

  1. 確認画面を表示するアクションを追加する
  2. 新規登録画面からの遷移先を変える
  3. 登録アクションで戻るボタンからの遷移に対応する

一覧画面に検索機能を追加する

検索機能を追加する手順は以下の通りです。

  1. Ransackをインストールする
  2. ransackメソッドを用いて、検索機能を追加する
  3. ransackの提供するヘルパーsearch_form_forを用いて、検索用フォームを作成する

メールを送る

メールを送信するためにAction Mailerという仕組みがある。
追加手順は以下の通り。

  1. ジェネレータを用いてメーラーを作成する(rails g mailer TaskMailler)
  2. 通知用メールを送るためのメソッドを追加する
  3. メールのテンプレートを実装する
  4. 用意したメーラーをコントローラから呼び出して、実際にメールを送るよう変更する

Chapter8 RailsJavaScript

この章では、RailsJavaScriptの関係について学ぶことができました!

AjxaとSJR

Ajax(Asynchronous JavaScript And XML)
Webブラウザ上で非同期通信を行い、ページの再読み込みなしにページを更新する

SJR(Server-generated JavaScript Response)
サーバサイドで生成したJavaScriptからなるレスポンスのこと

a要素のクリックイベントをフックとして遷移先のページをAjaxで取得する。
取得したページが要求するJavaScriptCSSが現在のものと同一であれば現在のものをそのまま使用し、 title要素やbody要素のみを置き換える。
→リクエストごとにJavascriptCSSをブラウザが評価しなくなるため、パフォーマンスが向上する。

注意点

  • ブラウザのページ遷移が発生しないことが多くなる
  • <script>はhead要素内に記述する

JavaScript管理

YarnFacebook社によって開発されたJavaScriptのパッケージマネージャ
Webpacker
JavaScriptのビルドツール「Webpack」のラッパーであり、RailsアプリケーションでWebpackを使ってJavaScriptを管理することを簡単にしてくれるGem

Chapter9 複数人でRailsアプリケーションを開発する

この章では、複数人開発でのアプリケーション管理について学ぶことができました!

マイグレーションの管理における注意事項

スキーマキャッシュ

スキーマキャッシュ
テーブルのスキーマを毎回データベースに問い合わせにいくことによるパフォーマンス低下を防ぐための機能。 スキーマキャッシュが古いと反映されず、古いままの値が出力される場合があるので、 手動でキャッシュを更新しなければならないケースがある。

Chapter10 Railsアプリケーションと長く付き合うために

この章では、バージョンアップやリファクタリングについて学ぶことができました!

バージョンアップ

バージョンアップ時に検討すべき内容は以下の通りである。 - 自動テストは十分か - 動作確認方法 - リリース方法 - リリース後の動作確認と監視方法 - 万が一のときのロールバック方法

複雑性への対応

複雑性へ対応するには以下の3つの鍵ある。

  • しかるべきところにコードを書く
    →モデルに書くべきコード(ビジネスロジックなど)をモデルに寄せる

  • 上手に共通化する
    →共通機能のモジュールをMix-inしたり、継承や抽象を用いて共通化を行う
    上記「しかるべきところにコードを書く」を行ってから共通化を行う必要あり

  • 新しい構造を追加して役割分担をする
    →共通処理を担当するオブジェクトを作成したり、外部サービスのロジックをオブジェクトに閉じ込めることで役割を分担する

全体の感想

  • Rubyの言語仕様から実際の運用まで説明されており、実際のアプリケーションの流れをイメージすることができた
  • 随所にコード例やモデル図などが用いられており、比較的理解しやすかった
  • Ruby on Railsのことが広く網羅されているので辞書のような形で使用するのもありだなと感じた

参考