宮水の日記

宮水の日記

主に書評や資格取得について記事を書いています。

パーフェクト Ruby on Rails

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby

今回は、パーフェクトRuby on Railsを読みました。

対象読者

対象読者は以下です。

⬛️ 普段Ruby on Railsを使っていて、一歩先の「レール」に乗りたい人
⬛️ Ruby on Railsの学習の始め、これから本格的に使っていきたい人
⬛️ 他のMVCフレームワークを扱ったことがあり、これからRuby on Railsを始める人

「一歩先の」「 他のMVCフレームワークを扱ったことがあり」という記述から、ちょっとRailsに慣れた人向けの本みたいですね。

注意点

rubyのバージョンは2.0.0 or 2.1.2Railsのバージョンは4.0.5 or 4.1.1も古いです。
今回はそれを逆手にとって、歴史を勉強するつもりで読みました。

1章 Rails overview

  • Rubyのインストール方法
  • gemとrakeタスク
  • Railsの思想
  • Railsのインストールとscaffold
rakeタスク

rakeタスクは普段書かないし、CoC, DRY, REST, 自動テストなどの考え方は良い復習になりました。
Railsのバージョンは古いですが、Windows用の話もたくさん書いてあって親切ですね。

html5がPUTとDELETEをサポートしていない話

なぜ html の form は PUT / DELETE をサポートしないのか? - Block Rockin’ Codes

Railsでformを使うときに、更新と削除だけmethod: deleteとかmethod: putとか記述するのはどうしてか考えたこともなかったです。
これをoverloaded POSTというそうです。rails-ujsとか入れないとdeleteができないとかちょっとめんどくさいですが、しょうがないことだったんですね。

PUTとPATCHの違い

PATCHはRails4.0から導入されたもので、二つは厳密にいうと違うそうです。
PUTは丸々更新、PATCHはリソースの一部を更新という使い分け。
PUTとPATCHの違いが気になった - その辺にいるWebエンジニアの備忘録

2章 Ruby on RailsMVC

  • MVCの説明
  • モデルの役割
  • コントローラーの役割
  • ビュー役割
MVCについて

MVCについてすっごい丁寧に書かれてました。2章を1人で理解できたらプログラミングスクールいらずです笑
Railsの使い方全部まとまってました。

ActiveRecord::Relation

ActiveRecord::Relationの説明で出てきた、クエリインターフェースって言葉を知らなかったので公式ドキュメントを読みました。
Active Record クエリインターフェイス - Railsガイド

ActiveRecord::Relationがあるからメソッドチェーンでクエリを作ることができるんですね。

コールバック一覧表

P59のコールバックポイントの一覧表めっちゃ便利でした。
情報がアップデートされているかもなので、使うときはちゃんと調べる必要があると思いますが、「これってdeleteのときも走るっけ...?」とか覚えてないですよね...
f:id:kattyan53:20200407093333p:plain

3章 アセット

最近はあんまり使わないので、さらっと読み流しました。
でも、RailsでJSとCSSを扱うときに必要な情報が全て詰まってました。

アセットとは

アセットって、Webアプリケーションの直接のレスポンスではない構成要素のことをいうんですね。

Sprockets

SprocketsはRackベースのアセットパッケージングツールで、Asset Pipelineの基盤となるgemであることも初めて知りました。一緒にしてました。。。

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

以下のようなMVC以外の構成要素の扱いについて触れています。

  • 外部のAPIと通信するためのクライアントライブラリや返り値のパーサー
  • 非同期処理のためのワーカー
  • データの暗号化
非同期処理とワーカー

私はRailsの非同期処理とワーカーは実装したことがないので、ちょっとだけRailsの非同期処理について調べてみました。

例えば、メール送信・画像変換・CSVアップロードによる大量SQL実行などで、
Rails で WEB 画面からのキックでジョブをバックグラウンドで実行したくなるときがある。

そんなときはバックグラウンドで非同期にジョブを実行してくれる便利な gem がある。
Sidekiq(gem) or Resque(gem) or Active Job(Rails を 4.2.1から。本書はギリギリバージョンが足りてなかった...)など。

Sidekiq, Resqueは、Redis(NoSQLの一つ)でキューを管理している。

参考:Rails 非同期で処理を実行する方法(Sidekiq, Resque, Delayed Job, Active Job比較) - Shred IT!!!!

5章 開発を効率化するgem

開発を効率化してくれるgemについて書かれていました。

  • pry-rails
  • Hirb
  • Better Errors
  • Spring
  • raiils-erd

そういえば最近Springってあんまり聞かなくなりましたが、最近のバージョンでもrails newしたときに自動で導入されるようです。
https://github.com/rails/spring#rake
この子のおかげで、railsコマンドやrakeコマンドの起動が早くて済むんですね☺️

6章 イベント告知アプリケーションを作る

  • ログイン
  • イベントのCRUD
  • ページネーション
  • ransackで検索処理
  • 画像アップロード

...と機能モリモリでした。

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

私は今の会社に入ってからRspecをまともに書くようになったのですが、その際に教えてもらったさわりの部分が全て網羅されていました。
テストの情報は、全体的にちょっと古かったので注意が必要ですが、以下の部分を除けば初めて書く人は絶対読んだら勉強になると思いました。

shouldとexpect

shouldよりexpectの方が使われている話はコラムで少し触れられていましたが、実際そうみたいです。
RSpecのshouldはもう古い!新しい記法expectを使おう! - Qiita

factory_girls

factory_girlsはfactory_botという名前になりました。

controller spec

また、Rails5からは request spec で記述することが推奨され、公式から controller spec を書くことは非推奨とされています。
controller specとrequest specで何をテストするべきかは、以下の記事がわかりやすかったです。
Rails5でコントローラのテストをController specからRequest specに移行する - Qiita

TDDの考え方

6章で作ったRailsアプリに、TDD方式で実装していました。
実装してからテストを書くと通るテストだけ書いてしまいがちなので、TDDは習慣づけたいところですが、いざやってみるとめっちゃ難しいです...。無理せずテスト→実装→テスト→実装...のサイクルを素早く回すといいと教えてもらったので最近はそうするようにしています。

CI(継続的インテグレーション

Jenkinsについて触れられていました。Jenkinsって単体で調べても何がいいのやらさっぱりわからなかったのですが、本書でこの流れで説明が出てくるのはとてもわかりやすいですね...!!

また本書では、Travis CIについても触れられていました。Githubと連携して自動でテストしてくれるそうです。便利そう!!
Travis CI - Test and Deploy Your Code with Confidence

カバレッジ

カバレッジとは、「アプリケーションのコード全体のうち、テストできたコードの割合はどれくらいか」という意味です。
私は昔「テストコードが通った割合」と勘違いしていました。難しいよね、カバレッジ

静的解析

プログラムを実行せずに、プログラムの問題点や脆弱性を調べて分析することを静的解析と言います。
本書ではbreakmanというgemが紹介されていました。

テストとはちょっと話がずれるのですが、動的解析できるgemもあります。
この子は、しばらくアプリを実行していると使っていないメソッドなどを割り出すことができます。
使っていないメソッドを割り出すと、不要なテストコードを消すことができるので、結果的にテストコードのリファクタにも役立つかも!
https://github.com/danmayer/coverband


8章 Railsのインフラと運用

8章では、サーバーの構築や構成管理、デプロイメントや監視について紹介されていました。
最近はデプロイっていうとherokuで一瞬で出来ちゃいますが、手動でやろうと思うとすごいたくさんの手順が必要なんですね...

DevOpsとは

DevOpsって結構前からある言葉なんですね。
アプリケーション開発者(Dev)と運用担当・インフラ担当エンジニア(Ops)がお互いに歩み寄る姿勢のことを表現する言葉だそうです。いい言葉ですね。
ちなみに私はインフラの知識はあんまりないので、DevOps積極的にやっていきたいです。

VagrantでローカルにVMを作る

本番に近い環境を、VMを用いてローカルマシンに構築します。
Vagrant とは、VirtualBoxなどを利用して仮想環境を立ち上げ、セットアップする作業をコマンド一つで行うためのツールです。
本書にあるバージョンでも無事ダウンロードできました。(30分かかった)

Chefを用いた本格的なサーバ構成管理

ChefとVagrantを連携します。
Chefとは、システム構成を自動化してくれるフレームワークだそうです。
Chefについてサクッと調べてみたら5年前の記事ばかり上に出てきたのでもしかしたらもうあんまり主流じゃないのかも...

この後エラーが出て詰みました。残念...
f:id:kattyan53:20200412231253p:plain

だということがわかりました。

次に、Capistranoを使ってデプロイしました。Capistranoも、もう結構主流じゃなさそう...

New Relicによるアプリケーションの監視

New Relicとはパフォーマンスの監視をエラーを記録してくれるツールです。
今の会社に入ってから初めて聞いたのですが、いまだに使い方を完全に理解できていない...

レスポンスタイムが遅いのには、大きく4つの要素があって、

  • Ruby / Railsの処理に起因するもの(1番多い)
  • データベースに起因するもの(2番目)
  • memcachedなど他のストレージに起因するもの
  • その他

があるそうです。

Web transactionsっていうのを見ると、ボトルネックになりがちなアクションがみれるとか知らなかった...

serverspecとインフラのテスト

インフラにもテストがあるんだ...

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

Fat Modelへの対応方法が書いてありました。

コールバックをクラスに抽出する

シンボルが普通ですが、こんな方法もあるんですねー!でも、あんまり見かけないかも...

ActiveModel

ActiveRecordを利用せずにRDBと直接対応しないクラスを作るときに便利だそうです!知らなかった!
Active Model の基礎 - Railsガイド

本書では以下のモジュールが紹介されていました。

  • ActiveModel::AttributeMethods
  • ActiveModel::Callbacks
  • ActiveModel::Dirty
  • ActiveModel::Naming
  • ActiveModel::Serialization
  • ActiveModel::Validations
値オブジェクト

「メールアドレス」や「住所」のように、「何である」かが重要であり、値が同じであればアプリケーション上は同一であるとみなして良いオブジェクトのこと。

住所という属性を扱うときに、Userモデルに実装すると責任範囲が広くなりすぎてしまいます。
また、CompanyやOrganizarionなどのモデルも住所を持っていてもおかしくありません。

こんなときに値オブジェクトを使ってAddress Classに切り出すことで、コンパクトな範囲に責任を限定できるというわけです。

composed_ofが値オブジェクトをマッピングするための機能だって知らなかった...!
これから実装する個人開発のモデルで使えそう!!

Concern

アプリケーションの横断的な機能はここにかく。
ActiveRecordモデルに関係する共通した振る舞いをモジュール化する際にもActiveSupport::Concernの記述スタイルは有効!

エラーハンドリングとかapplication_controller.rbに書きがちだけどActiveSupport::Concernに切り出してみようかな。

サービスクラス

コントローラとモデルの中間のイメージで、「認証サービス」とか「価格計算」のように機能や振る舞いそのものを表す実装をするときに使えるクラス。

でも、処理そのものをカプセル化するという意味合いが強くて、乱用すると本来モデルにあるべき処理がモデルからするとブラックボックス化されているのはよくないので、使うときはよく考える!

10章 Railsを拡張する

Rack MiddlewareでBasic認証を作ったり、Railtieを使ってプラグインを作ったりしていました。
gemを作ってみたい人にはおすすめの章です!

まとめ

「パーフェクトRuby on Rails」、その名の通り基礎から応用まで幅広く業務で使う実践的な知識が詰め込まれている良書でした
一部古い情報も含まれていましたが、適宜検索すればその情報が古いのか古くないのかわかるのでそこまで気にならなかったです。

私はプログラミングスクール自体も含めるとRailsと出会って2年半、
ちゃんと仕事で使うようになったのは1年半くらいなのですが、難易度はちょうどよかったです。
現在大きなRailsアプリを扱っていて、ときどきみたことない書き方に出くわすこともあり都度調べていましたが、本書を読んだことでもっと大きな概念を掴めました。

この1冊が理解できる人は、すぐにRailsの現場で働けると思います。
もっとRailsを使いこなしたい人は必須の1冊です!!