Ruby on Rails 5速習実践ガイドを読んだ感想

はじめに

Railsのインプットに現場で使える Ruby on Rails 5速習実践ガイドを使用しました。
読了したので内容の整理も兼ねて感想を書いていきます。

良かったところ

  • Rubyの基礎構文からRailsテストまでハンズオンで学べる
  • SlimやRspecなどの現場でよく使われる技術を学べる
  • 現場に入った後でも参考になるようなセクションがある
  • 必ずパスが指定されておりどのファイルにコードを記述すればよいか分かりやすい

悪かったところ

  • コード説明がない箇所が稀にあり、意味を自分で調べる必要がある
  • Rails5の環境構築が難しい(教材通りにしてもかなりエラーが発生する)
  • ↑の理由によりRails7で環境構築を行い進めるが、やはりこちらでもエラーが多発する
  • kindleでコードがコピーできない

そもそもRails5を想定した教材なのでRails7でエラーが多いのは仕方ないですね。
時間はかかりますがRails7で進めて、エラーの都度調べて修正するのが力もつくし良いかと思います。

学んだこと

Chapter1. RailsのためのRuby入門

Rubyの基礎構文を学習します。 チェリー本を既読していたので特に目新しい理解はありませんでしたが、Railsに入る前にRubyの復習を出来たので良かったです。 特にぼっち演算子(&.)はよく出てくるので覚えておきましょう。

Chapter2. Railsアプリケーションをのぞいてみよう

ローカルにRailsの開発環境を構築します。
自分はDockerを学習済みだったので、Dockerで環境構築を行いました。

(Dockerで環境構築した記事も作成しました)
Rails7 + postgreSQL + bootstrapの環境構築

書籍にDockerの環境構築の手順が書かれている訳ではないので、ここでかなり苦戦した記憶がありますが、最終的にはDockerの理解が深まったので良かったです。

Chapter3. タスク管理アプリケーションを作ろう

このChapterから本格的にアプリケーションを作成します。
RailsのViewはerbで記述するのが当たり前でそれしかないと思っていたのですが、erbと比較して少ないコード量で書けるSlimと呼ばれるテンプレートエンジンが現場でよく使われているそうです。 この書籍でもこのSlimを使用して進めていきます。

書き方の違いは次にようになります。

  • html
<h1><%= @example %></h1>
  • slim
h1= @example

slimはタグ(<>)を省略して記述している事が分かります。
画面に表示させたくない場合は=ではなく-を使用します。


実装する機能はCRUD機能と呼ばれる基本的なデータ操作です。
RailsはRESTの設計思想を取り入れており、ルーティングがその設定を担っています。

例えば、TODOアプリでタスクの一覧画面を表示するページがあったとします。
そのURIはリソース(この場合はタスク)を一意に識別できる必要があり、URIには/tasksが付けられます。このURItaskの複数形であるため、タスクの一覧を表示するページであることがURIから判別できます。

RESTについては以下の記事で解説しています。
REST APIについて理解する

Chapter4. 現実の複雑さに対応する

データの加工とログイン機能を実施します。
データベースにテーブルやカラムを追加したり修正する作業はマイグレーションという機能を使用して行います。 このマイグレーションを使ってデータベースに不正な値を登録できないようにデータを制限する事も可能です。

例えば特定のカラムでNULLを許容しない場合は次のように記述します。

class CreateTasks < ActiveRecord::Migration[7.0]
  def change
    create_table :tasks do |t|
      t.string :name, null: false
      t.text :description

      t.timestamps
  end
end


この方法ではデータベースにデータを格納する時にエラーが発生します。
ですがデータベースに保存する前にもデータの検証を行う事が一般的です。
Railsではvalidatesメソッドを使ってモデルの検証を行う事が出来ます。
先程のNULLを許容しないvalidatesの書き方は次の通りです。

class Task < ApplicationRecord
  validates :name, presence: true
end


ログイン機能はセッションを使用して実装されます。
サーバー側でログイン認証が完了した際に、セッションIDを発行しHTTPレスポンスとしてクライアント側に送ります。 クライアントはこのセッションIDをクッキーに保存し、HTTPリクエストを送信する際にセッションIDを含めて送ります。 サーバー側はこのセッションIDを参照することで、クライアントがログインしているかどうかを判断できます。

Chapter5. テストをはじめよう

Rspecを使ってテストを実装します。
Rspecを活用してテストを組み込むことにより、確かに時間投資は必要とされますがその見返りとして得られるメリットは計り知れません。
特にリファクタリング時にその機能性を保持しつつ改善を図る場合、テストが正常に通過することでその機能が確実に動作するという保証を得ることが出来ます。

テストには様々な種類がありますが、中でも重要なのがシステムテストです。
システムテストを行うことで、ブラウザを介したアプリケーション全体の挙動を外から確認することができます。 これにより予期せぬタイミングで特定の機能が停止するなどの問題を検出し、不具合の可能性を減らす事ができます。

個人的にはこのChapterが一番難しく感じました。 理解が浅いので別途専用の教材で学習予定です。

Chapter6. Railsの全体像を理解する

ルーティングの仕組みをRESTの考え方に基づいて学習します。
ルーティングの定義に非常に便利なresourcesメソッドがあります。
これは1発で7つのアクションに対応するルートを定義できます。

# 個別でルートを定義した場合
get '/tasks', to: 'tasks#index'
get '/tasks/:id', to: 'tasks#show'
get '/tasks/new', to: 'tasks#new'
post '/tasks', to: 'tasks#create'
get '/tasks/:id/edit', to: 'tasks#edit'
patch '/tasks/:id', to: 'tasks#update'
delete '/tasks/:id', to: 'tasks#destroy'

# resourcesを使用した場合(上と同じ意味)
resources :tasks


他にもアセットパイプラインを学習します。
これはCoffeeScript、SCSS、ERB、Slimで記述されたコードをコンパイルして、ブラウザが認識できるJavaScriptCSSファイルに集約する機能です。 特別設定せずとも自動で行われ、ファイル名にダイジェストと呼ばれるコード内容から算出したハッシュ値が付与されます。 コード内容が変わればハッシュ値も変わりますから、ブラウザのキャッシュの影響で修正が反映されないという問題を防ぐ事が出来ます。

Chapter7. 機能を追加してみよう

タスク管理アプリに便利な機能を追加します。

  • 検索機能
  • ソート機能
  • メール送信機能
  • ページネーション
  • 画像登録機能

これは全てgemを使って実装することができ、自分で1から機能を実装する必要はありません。

Chapter8. RailsJavascript

RailsJavaScriptを動かします。
Ajaxという技術を活用することで、ページ全体を再読み込みすることなく特定のページ部分を更新できることを学びました。
またWebpackerとYarnを用いてReactを導入します。 WebpackerはRails 6まで推奨されていましたが、Rails 7からはJavaScriptCSSのバンドリングにjsbundling-railsやcssbundling-railsの利用が推奨されているようです。

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

チーム開発における注意点について説明されています。
特にGitの操作において注意すべき点が紹介されており、リベースやマージしたコミットをpushする際の確認ポイントについて学ぶことができました。

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

Rubyやgemのアップデートを行う際は、動作に影響が出ないか十分に検討する必要があります。 本書では小さなバージョンアップを推奨しており、アプリケーションはリリースしたら完成ではなく、継続的にバージョンアップすることが大切であると理解出来ました。

難しかったこと

個人的にSlimの書き方に慣れず苦戦しました。
erbは記述量が増えますが、直感的で分かりやすいなと感じました。