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

現場で使える Ruby on Rails 5速習実践ガイド(特典PDF付き)
- 作者: 大場寧子,松本拓也,櫻井達生,小田井優,大塚隆弘,依光奏江,銭神裕宜,小芝美由紀
- 出版社/メーカー: マイナビ出版
- 発売日: 2018/10/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
ちなみに、読み終わった直後の感想はこれ。
#現場rails を読了。図で分かりやすく説明されてたり、実際の開発の流れを想定した説明があったり、実務でありがちな要件をRailsで実装する例を紹介していたり、なかなかに実践的な本だなーという感想。Railsエンジニアはとりあえず読んでおくと良いと思う。
— 神速 (@sinsoku_listy) 2018年11月17日
全体の感想
Twitterにツイートしてあるように、良い本だと思う。 Railsの全体像を丁寧に説明してある本なので、Railsを触り始めたばかりの人とか、Railsをもっと知りたい人にはとてもおすすめできる本です。
あと、本を読んでいて、いくつも「あ、これ仕事でよくあるやつだ」みたいなのが書かれていて、実践的な印象を受けました。
各章の感想
ここからは各章で思ったことを書いていきます。
#現場rails に関して気になったところがいくつかあるので、たぶん後でブログを書く。すごく丁寧に書かれていて良いなーってところと、いやその実装はちょっと...ってところがある。
— 神速 (@sinsoku_listy) 2018年11月17日
他の方の感想がいくつか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しない方が良い
- 📝p.316 自分ならコントローラーに
import
アクションを作らず、 Tasks::Importings#create とかにするなー - 👻p.327
set(wait:1.week)
は他コードに合わせてスペース入れた方が良い
8. RailsとJavaScript
- ⭐️p.340 Turbolinks の良い点、ハマりどころが丁寧に書かれていてすごく良い
- Turbolinks はやれば出来る子なんです
- みんなすぐ無効にするけど
- ⭐️p.347 Webpacker のメリット、デメリットを紹介してるのも良いですねー
9. 複数人でRailsアプリケーションを開発する
- ⭐️p.354 実際の仕事の流れを追体験できて良いなと思った
- 📝p.362 database.yml をGit管理しない場合、CIの設定やデプロイフローが複雑になってしまう
- 個人的には database.yml をGit管理しておき、何か変えたい場合は
DATABASE_URL
で調整する方が好きかな
- 個人的には database.yml をGit管理しておき、何か変えたい場合は
- ⭐️p.366 git-bisect に言及してるの最高に良い!
- 📝p.367 rebaseは英語で、マージがカタカナなのが少し気になった
- Gitの書籍だと「リベース/マージ」とカタカナ統一な気がする
- ただ、仕事だとrebase/マージって書いてる人が多い印象
- ⭐️p.378 マイグレーションの話が丁寧
- 📝p.382 ridgepole を紹介しても良いかも、と思った
- 👻p.386
Order. find_each
と半角スペースが入っていた - ⭐️p.387 スキーマキャッシュの説明があるの良い
- onkさんがブログに書いていた話 migration の中で model を触ったら必ず reset_column_information する
- gemを入れておくと
reset_column_information
を自動でしてくれるので便利
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に気づいたところはフィードバックのためにもブログ書いた。 このブログが著者の目にとまって、何かしら本に反映されたら嬉しい。