- 作者:Rubyサポーターズ
- 発売日: 2017/05/17
- メディア: 大型本
今回は、パーフェクトRuby on Railsを読みました。
対象読者
対象読者は以下です。
⬛️ 普段Ruby on Railsを使っていて、一歩先の「レール」に乗りたい人
⬛️ Ruby on Railsの学習の始め、これから本格的に使っていきたい人
⬛️ 他のMVCフレームワークを扱ったことがあり、これからRuby on Railsを始める人
「一歩先の」「 他のMVCフレームワークを扱ったことがあり」という記述から、ちょっとRailsに慣れた人向けの本みたいですね。
1章 Rails overview
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 RailsとMVC
- MVCの説明
- モデルの役割
- コントローラーの役割
- ビュー役割
ActiveRecord::Relation
ActiveRecord::Relationの説明で出てきた、クエリインターフェースって言葉を知らなかったので公式ドキュメントを読みました。
Active Record クエリインターフェイス - Railsガイド
ActiveRecord::Relationがあるからメソッドチェーンでクエリを作ることができるんですね。
コールバック一覧表
P59のコールバックポイントの一覧表めっちゃ便利でした。
情報がアップデートされているかもなので、使うときはちゃんと調べる必要があると思いますが、「これってdeleteのときも走るっけ...?」とか覚えてないですよね...
3章 アセット
- Sproketsの概要
- CoffeeScript
- Sass
- Turbolinks
最近はあんまり使わないので、さらっと読み流しました。
でも、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コマンドの起動が早くて済むんですね☺️
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年前の記事ばかり上に出てきたのでもしかしたらもうあんまり主流じゃないのかも...
この後エラーが出て詰みました。残念...
- NginxはWebサーバ(ブラウザからのリクエストを一番最初に受け取る)
- Unicornはアプリケーションサーバ(Railsのプロセスを別途立ち上げる)
だということがわかりました。
次に、Capistranoを使ってデプロイしました。Capistranoも、もう結構主流じゃなさそう...
New Relicによるアプリケーションの監視
New Relicとはパフォーマンスの監視をエラーを記録してくれるツールです。
今の会社に入ってから初めて聞いたのですが、いまだに使い方を完全に理解できていない...
レスポンスタイムが遅いのには、大きく4つの要素があって、
があるそうです。
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に切り出してみようかな。
まとめ
「パーフェクトRuby on Rails」、その名の通り基礎から応用まで幅広く業務で使う実践的な知識が詰め込まれている良書でした。
一部古い情報も含まれていましたが、適宜検索すればその情報が古いのか古くないのかわかるのでそこまで気にならなかったです。
私はプログラミングスクール自体も含めるとRailsと出会って2年半、
ちゃんと仕事で使うようになったのは1年半くらいなのですが、難易度はちょうどよかったです。
現在大きなRailsアプリを扱っていて、ときどきみたことない書き方に出くわすこともあり都度調べていましたが、本書を読んだことでもっと大きな概念を掴めました。
この1冊が理解できる人は、すぐにRailsの現場で働けると思います。
もっとRailsを使いこなしたい人は必須の1冊です!!