ねこものがたり

いちにちいっぽ

『パーフェクトRuby on Rails 【増補改訂版】』を読みました

gihyo.jp

ざっくりの感想

  • 最初からサンプルコードがたくさんあって、手を動かしてどんどん次にいくぞ!という感じで進められたので終始楽しかったです。
  • 「実際の開発ではこのようにします」など、実践的な知見がたくさん詰まっていました!
  • コラムがだいぶいい。全編はボリュームが多いという人でもコラムだけは読んだほうがいいと思うくらいコラムがいい。
  • 「なぜそうするか」が解説してあるので現実の開発で応用が効きそう。

個人的に勉強になったこと

一番は11章「複雑なドメインを表現する」とか12章「複雑なユースケースを実現する」のあたり。 最近(というわけでもないけど最近)DDDやクリーンアーキテクチャにとっても興味があって、DDDの本を読んだり勉強会に出てみたり話を聞いてみたりしています。 でも「Railsドメイン駆動設計ってなんかこういまいち自分の中で結びつかないぞ?」と感じていました。 そんなステータスの中でこの本を読んだのですがDDDの考え方や物事の切り出し方には適応できそうなのかなと感じました。

あるモデルにドメインのルールが書かれすぎていないかとか、ユースケースを適切に扱っているかとか。

またそれに伴い、少ししか使ったことがないのですが、書籍でふんだんに紹介されていたActiveModelのモジュールについて理解を深め、実装時に使ってけるようにしたいと思いました。

アプリケーションコードを書くというのは現実世界をどう切り出すのか、それをどう表現するのかということだなーと感じているのですが、その辺りの力をつけるためにとても為になる章だと感じています。 いろんなケースに出会ったりプロダクトを作ったり経験を積んでいきたいと常日頃から思っているのですが、それ同時にその都度この本の内容を振り返って「このケースではどのようにするのがいいだろう」と毎回考えて開発していきたいと強く思いました!

発見したこと

これはだいぶ地味だと思うんですが、6章の中にユーザーの退会処理を作る箇所があり、その中に

def check_all_events_finished
  now = Time.zone.now
  if created_events.where(":now < end_at", now: now).exists?
    errors[:base] << "公開中の未終了イベントが存在します。"
  end
  if participating_events.where(":now < end_at", now: now).exists?
    errors[:base] << "未終了の参加イベントが存在します。"
  end
  throw(:abort) unless errors.empty?
end

というコードが出てきます。 ここの趣旨は「callbackを使って削除していいかどうかチェックできるよ」っていう話だと思うんですが、私はこれをみて「throw(:abort)使ってる!!!こういう使いかたができるのか!!!便利!!!!」と感動しました。

というのは、少し前に「俺はRubyのことが何もわからない」という気持ちになって何度目かのチェリー本をやっていた際に「catch/throwで制御できるってあるけど自分で書いたことがないなーどういうユースケースがあるのかが飲み込めてないな」と疑問を抱いていました。

そのときちょうどAsakusa.rbがあったので質問してみたり( 記録)ということがあったので、頭の片隅に関心ごととしてずっとのこっていました。だから「こういうところで使えるのか!」と知れてすごく嬉しかったし「使ってみたい!」と一人で感動していた次第です。

あと、これに関してはRailsが4系から5系に上がったときの仕様変更で使うようになったみたいだということも発見しました! 自分はRails5系から入った人なので、throwをきっかけにRailsの歴史にちょと触れられたことも嬉しく思います。

5.3 throw(:abort)でコールバックチェーンを停止する

最後に

すごく内容の濃い書籍なので、もっともっと勉強になったことはたくさんありますが、心に強く残ったのを挙げると以上となります。 書籍に沿うとサンプルアプリをいくつも作ることになるわけですがその度に rails gコマンドなどであらゆるものが生成できたりして「便利すぎる」と今更震えたりもしましたw そんな感じで楽しく読み切れました。

大変素晴らしい書籍をありがとうございました。