「現場で使えるRuby on Rails5速習実践ガイド」の感想 #現場rails

なかなか読む時間が取れなくて積み本になっていたのを週末に読んだので、その感想です。

現場で使える Ruby on Rails 5速習実践ガイド(特典PDF付き)

現場で使える Ruby on Rails 5速習実践ガイド(特典PDF付き)

ちなみに、読み終わった直後の感想はこれ。

全体の感想

Twitterにツイートしてあるように、良い本だと思う。 Railsの全体像を丁寧に説明してある本なので、Railsを触り始めたばかりの人とか、Railsをもっと知りたい人にはとてもおすすめできる本です。

あと、本を読んでいて、いくつも「あ、これ仕事でよくあるやつだ」みたいなのが書かれていて、実践的な印象を受けました。

各章の感想

ここからは各章で思ったことを書いていきます。

他の方の感想がいくつかWeb上にあったけど、みんな褒めていたので、このブログでは少し辛口のフィードバックもつけておきました 🍛🔥

絵文字は以下の分類でつけてます。

  • ⭐️よかったところ
  • 👻誤植、typo
  • 📝個人的に気になったところ

1. RailsのためのRuby入門

  • ⭐️p.002 Rubyの基本的なところから説明してあるし、Rails初心者でも読みやすそう
  • 👻p.036 のコード例はいくつか間違っている
    • メソッド最後の後置ifはnilを返すケースがあり、意図した挙動にならない
    • given_name と family_name が逆?
    • 実行例は "浦島太郎" だけど、コード例だと "浦島 太郎" と空白が入る
def name(full: true, with_age: true)
  n = if full
        "#{given_name} #{family_name}"
      else
        given_name
      end
  n << "(#{age})" if with_age
end
  • ⭐️p.050 eachからmapへの説明が丁寧だ

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

  • ⭐️p.052 Windowsまで考慮しててすごい
  • ⭐️p.055 rbenvを入れるあたり、実践的で良い
  • ⭐️p.079 ルーティングからの流れを図で説明してて、良い本だ

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

  • ⭐️slim、bootstrapを使っていて実践的だなーと思った

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

  • ⭐️p.128 マイグレーションの名前の付け方。初心者は嵌りそうなやつ。
  • ⭐️p.129 migrate:redo を紹介されてる。そうそう、大事なやつ。
  • ⭐️p.130 DB制約とバリデーション大事。
  • ⭐️p.145 コールバックの説明が分かりやすい

5. テストをはじめよう

  • ⭐️p.188 RSpec、Capybara、FactoryBot の組み合わせは実践的で良いと思った
  • 📝p.198 factory :user で email が固定値になっていて微妙
    • ユニーク制約がかかっているカラムは sequence を使うべき

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

  • ⭐️p.226 Railsで開発していく中で必要そうな技術の用語が並んでいて良い
  • 📝p.238 多言語対応の説明してあるけど、コード例はコントローラーに日本語書いてあって中途半端
    • ただ、初心者向けの書籍で完全な多言語対応するのも限度あって難しそう
    • 「多言語化しようとして序盤はlocale使うけど、途中で諦めてコントローラーに日本語書いてる案件」は多いし、ある意味では実践的?
  • 📝p.249 「ルーティングで発生した例外」に対して言及しているのに、それに対する対処方法がないのモヤっとした
    • rambulance の紹介とかあっても良いのでは
  • ⭐️p.250 ロガーの話してるの良い
  • ⭐️p.253 セキュリティに関して丁寧に説明していて良い。新人に読ませたい
  • ⭐️p.278 5.2 で導入されて色々な議論を生んだ Credentials だ 🔑
  • 📝p.284 そして、一切触れられなかった ActionCable さん...

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

  • ⭐️p.291 確認画面について言及しているの良い
  • 📝p.292 ransack は簡易的な実装としては良いけど、Elasticsearch とかのちゃんとした対応について言及して欲しかった
    • ransack を入れた後、パフォーマンスの問題が出て誰かが直す事に...
    • ただ、 ransack で検索条件を絞る話を書いてあるのはすごく良い。大事なので。
  • 📝p.299 TaskMailer#creation_email のメソッド名にある email が冗長な気がする
    • とはいえ、他に良いメソッド名は思い浮かばない
    • メーラー周りの命名はいつも悩むけど、未だに良い命名規則を見つけられていない
  • 📝MailerPreview は紹介されていなかった
    • htmlメールの見栄えを確認できて便利なやつなので、ぜひ改訂版では1ページぐらい紹介してあげて欲しい
  • 📝p.304 text/html のテストが全く同じだけど、htmlの方は「タグの有無」くらいテストした方が良いのでは?
    • html_body の中で content_type みてるし、要らないのかもしれない
  • ⭐️p.306 ActiveStorage の説明が最低限はあった
    • purge や with_attached_image の説明がないのは少し残念
  • ⭐️p.312 CSVのインポート・エクスポート。顧客から「Excelでみたい」って言われたときに作るやつですね
  • 📝p.312 CSVのエクスポートは件数増えると重くなるので、普通にpostしない方が良い
    • CSVエクスポートの要求を受けつけて、非同期処理でCSVを作って、作り終わったら画面にダウンロードリンクを出す
  • 📝p.316 自分ならコントローラーに import アクションを作らず、 Tasks::Importings#create とかにするなー
  • 👻p.327 set(wait:1.week) は他コードに合わせてスペース入れた方が良い

8. RailsJavaScript

  • ⭐️p.340 Turbolinks の良い点、ハマりどころが丁寧に書かれていてすごく良い
    • Turbolinks はやれば出来る子なんです
    • みんなすぐ無効にするけど
  • ⭐️p.347 Webpacker のメリット、デメリットを紹介してるのも良いですねー

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

  • ⭐️p.354 実際の仕事の流れを追体験できて良いなと思った
  • 📝p.362 database.yml をGit管理しない場合、CIの設定やデプロイフローが複雑になってしまう
    • 個人的には database.yml をGit管理しておき、何か変えたい場合は DATABASE_URL で調整する方が好きかな
  • ⭐️p.366 git-bisect に言及してるの最高に良い!
  • 📝p.367 rebaseは英語で、マージがカタカナなのが少し気になった
    • Gitの書籍だと「リベース/マージ」とカタカナ統一な気がする
    • ただ、仕事だとrebase/マージって書いてる人が多い印象
  • ⭐️p.378 マイグレーションの話が丁寧
  • 📝p.382 ridgepole を紹介しても良いかも、と思った
  • 👻p.386 Order. find_each と半角スペースが入っていた
  • ⭐️p.387 スキーマキャッシュの説明があるの良い

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

  • ⭐️p.392 バージョンアップ大事
  • 👻p.393 bundleupdate スペースが無い
  • 📝p.403 自分なら Articles::PublicationsController を作るかな
    • とはいえ、このコードも早すぎる最適化っぽさはある
# app/controllers/articles/publications_controller.rb
module Articles
  class PublicationsController < AppliationController
    def create
      @article = Article.find(params[:article_id])
      publication = Articles::Publication.new(article: @article)

      if publication.save
        redirect_to @article, notice: '記事を公開しました'
      else
        message = publication.errors.full_messages.first
        redirect_to @article, alert: message
      end
    end
  end
end

# app/models/articles/publication.rb
module Articles
  class Publication
    include ActiveModel::Model
    attr_accessor :article

    validate :must_be_draft

    def save
      return false if invalid?

      set_expires_at! if article.limited?
      update(status: 'published', published_at: Time.current)
    end

    private

    def must_be_draft
      errors.add(:base, '下書きの記事のみ公開にできます') unless article.status == 'draft'
    end

    def set_expires_at!
      article.expires_at = (article.published_at + 3.months).end_of_month
    end
  end
end
  • 📝p.414 upload_image ってアクションを持つコントローラー?
    • どんなルーティングを想定しているのかよく分からなかった
  • ⭐️p.416 ApplicationController に実装して、後から Module に抽出するの実践感あって良い
  • 👻p.444 ルーティングとコントローラの実装が不一致
    • たぶん GET /order_csvs.csv がエクスポートで、 POST /order_csvs がインポートかな
    • そうなるとルーティングが only: %i(index create) になるのが正しそう
resources :order_csvs, only: %i(index update)

class OrderCsvsController < ApplicationController
  def index
  end

  def create
  end
end
  • ⭐️p.450 最後の「使うべきか議論の余地が大きいメソッド」で笑った。〆が良い

最後に

良い本だなーと思ったので、気になったところやtypoに気づいたところはフィードバックのためにもブログ書いた。 このブログが著者の目にとまって、何かしら本に反映されたら嬉しい。