『実践Ruby on Rails 4: 現場のプロから学ぶ本格Webプログラミング』正誤表

2014/05/05

『実践Ruby on Rails 4』読者サポートページ

最終更新日:2017年5月25日

正誤表(初版第1刷)

書籍全体に渡るもの

ファイル名が _spec.rb で終わるすべてのファイルのソースコードの1行目 重要

誤 require 'spec_helper'
正 require 'rails_helper'

RSpec のバージョンアップによる変更です。該当ページは以下の通りです: 64, 67 (2箇所), 70, 145 (2箇所), 146, 176, 205, 206, 239, 241, 243, 257, 258, 272, 273, 276, 278 (2箇所), 327, 328, 432, 484。

Chapter 1

P.17 本文9行目

誤 環境変数PATHにC:\MinGW\msys\1.0を追加します(コラム参照)。
正 環境変数PATHにC:\MinGW\msys\1.0を追加します(前項「環境変数PATHの設定」参照)。

Chapter 2

本文 p.15 「環境変数PATHの設定」サブセクションの 1 行目

誤 次の2つの文字列を
正 次の2つの文字列を

本文 p.15 「環境変数PATHの設定」サブセクションの箇条書き

誤:

  • C:\MinGW\msys\1.0
  • C:\Program Files\Oracle\VirtualBox

正:

  • C:\MinGW\bin
  • C:\MinGW\msys\1.0
  • C:\Program Files\Oracle\VirtualBox

本文 p.16 にある1つ目の箇条書き(第1項目)

誤 コントロールパネルから「システム」を選択します。
正 コントロールパネルから「システムとセキュリティ」を選択し、「システム」を選択します。

本文 p.16 にある1つ目の箇条書き(第4項目のb.)

誤:

「変数値」の末尾にセミコロン(;)を加え、さらに上記2つの文字列をセミコロンで区切って書き加えて「OK」ボタンをクリックします。

正:

Windows 10の場合、「新規」ボタンをクリックして、上記3つの文字列を別々の項目として追加します。Windows 7/8.1の場合、「変数値」が空でなければ、末尾にセミコロン(;)を加え、さらに上記3つの文字列をセミコロンで区切って書き加えて「OK」ボタンをクリックします。

本文 p.16 にある1つ目の箇条書き(第5項目のc.)

誤:

「変数値」に上記2つの文字列をセミコロンで区切って書き加えて「OK」ボタンをクリックします。

正:

手順4(b)と同様。

本文 p.16-17 にまたがる箇条書き

  • 第5項目にあるサブ箇条書きの第3項目「msys-mintty(Class欄が「bin」のもの)」を削除する。
  • 第11項目「環境変数PATHに…(コラム参照)。」を削除する

本文 p.17 のサブセクション「MinGW Shellの使い方」

この直前に「msys-minttyのインストール」という見出しのサブセクションを加え、その本文として以下の内容を加える。

デスクトップでキーボードからWindowsロゴキーとRキーを同時に押し、「ファイル名を指定して実行」ダイアローグを開き、cmd と入力して「OK」ボタンをクリックするとコマンドプロンプトが開きます。これに対して、以下のコマンドを順に入力してください。

さらに、その下にコマンド入力例として以下の内容を加える。

mingw-get update
mingw-get install msys-install

P.19 本文2行目

誤 http://www.vagrant.com/
正 http://www.vagrantup.com/

P.21 本文4行目の上に次のMemoを追加

WindowsとMac OS Xで用語を合わせるため、今後WindowsのMinGW Shellを「ターミナル」と呼ぶことにします。

P.21 第1のコマンド入力例

1 行目の cd ~/projects/baukis の前に、次のコマンドを追加する。

vagrant plugin install vagrant-vbguest

P.22 本文2行目

誤 コマンドプロンプト
正 コマンド入力を促す記号

Chapter 3

P.28 コラム3行目

誤 robot09.rbの6~8行では
正 robot03.rbの6~8行では

Chapter 4

P.46 下から1行目

誤 ruby '2.1.0'
正 ruby '2.1.2'

P.47 1行目

誤 Ruby 2.1.0
正 Ruby 2.1.1

P.47 第1のMemo 2行目

誤 Ruby 2.1.0
正 Ruby 2.1.2

P.47 第1のMemo 3行目

誤 Ruby 2.1.1
正 Ruby 2.1.3

P.47 コード例 1行目

誤 gem 'therubyrace', platform: :ruby
正 (削除)

ゲスト OS として CentOS を採用した場合のみ、この変更を適用してください。ただし、最新の Vagrantfile (v1.0.5) を利用することが前提条件です。Ubuntu を採用している方は、そのままこの行を残してください。

P.47 コード例 下から2行目

誤 gem 'database_cleaner', '~> 1.2.0'
正 (削除)

P.47 コード例

末尾に次の記述を追加。

gem 'rake', '< 11.0'

この変更の意味については 最初の RSpec テストが失敗する場合 を参照してください。

P.49 コマンド実行例 下から2行目

誤   * uglifier (2.4.0)
正   * uglifier (2.5.0)

P.49 コマンド実行例 下から1行目

誤   * xpath (2.0.0)
正 (削除)

P.52 3行目

誤 config/database.ymlを開き、
正 データベース管理システムとしてPostgreSQLを利用している場合、database.ymlを修正する必要はありません。

P.52

  • 第3のコード例「username: baukis」から第4のコード例「username: vagrant」までを削除。
  • ページ末尾のMemoを小項「PostgreSQLを利用している場合」の前に移動。

P.59 6行目

誤 C:¥Windows¥System32¥drivers
正 C:¥Windows¥System32¥Drivers¥etc

P.59 下から4行目の上に次のMemoを追加

Windowsでhostsファイルを編集する場合は、エディタを管理者権限で実行する必要があります。

Chapter 5

P.63 8行目 重要

誤 spec_helper.rbというファイルが生成されます。初期状態での内容は
正 spec_helper.rbとrails_helper.rbというファイルが生成されます。後者の初期状態での内容は

執筆当時の rspec-rails のバージョン 3.0.0.beta2 では書籍の記述通りなのですが、その後に正式リリースされた 3.0 では、このように2つのファイルが生成されます。

P.63 ソースコードを次のものと差し替え 重要

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
end

2行目が追加。8行目と13行目が変更。このソースコードは config/rails_helper.rb の初期状態を示すものです。差し替え前のソースコード12行目にある config.order = "random" という記述は config/spec_helper.rb に残っていますが、初期状態ではコメントアウトされています。

P.63 本文下から1行目

誤 Rails 4.1に対応するため、このファイルの7行目を次のように書き換えてください。
正 (削除)

P.64 第1のコード例

誤 ActiveRecord::Migration.maintain_test_schema!
正 (削除)

P.74 本文4行目

誤 spec/spec_helper.rb を
正 spec/rails_helper.rb を

P.74 ソースコード

  • 12行目の config.order = "random" を削除。
  • 左端の行番号 8-199-19 に振り直す。

Chapter 6

P.88 3行目の末尾に以下の文言を追加

application.html.erb を以下のように修正して下さい。

P.102 第2のソースコード 12行目

  • $light_gray の太字強調を取る。

Chapter 7

P.121 ソースコード 14 行目

誤 root 'errors#routing_error'
正 root 'errors#not_found'

P.121 ソースコード 15 行目

誤 get '*anything' => 'errors#routing_error'
正 get '*anything' => 'errors#not_found'

P.122 2行目

誤 'errors#routing_error'
正 'errors#not_found'

P.122 3行目

誤 errorsコントローラのrouting_errorアクションを
正 errorsコントローラのnot_foundアクションを

P.122 7行目

誤 errors#routing_errorアクションに
正 errors#not_foundアクションに

P.122 ソースコード 2 行目

誤 def routing_error
正 def not_found

P.127 ソースコード 19 行目

誤 if request.path.match(%r{/(staff|admin|customer)\b})
正 if params[:controller].match(%r{\A(staff|admin|customer)/})

Chapter 8

P.134 3行目

誤 StaffModel
正 StaffMember

P.145 第2のソースコード 3行目

誤 describe
正 RSpec.describe

P.145 第3のソースコード 3行目

誤 describe
正 RSpec.describe

ただし、RSpec の部分に二重削除線を加える。

Chapter 9

P.165 第2のコード例 2行目

誤 type="email" />
正 type="text" />

P.178 MEMOの下に以下の内容を追加

  • (本文) Spring を停止します。
  • (コマンド) $ bin/spring stop
  • (MEMO) app ディレクトリの下に新たにサブディレクトリを追加した場合、Spring を停止しないとそのサブディレクトリが自動読み込みの対象になりません。Spring の停止を怠ると uninitialized constant Staff::Authenticator のようなエラーが発生します。

Chapter 10

P.189 第5のコード例2行目

誤 get 'articles/:year/:number', as: :article
正 get 'articles/:year/:number' => 'articles#show', as: :article

P.206 ソースコード23行目と30行目

誤 action: 'routing_error'
正 action: 'not_found'

P.207 コード例

誤 get '*anything' => 'errors#routing_error'
正 get '*anything' => 'errors#not_found'

P.207 演習問題21行目

誤 利用者が顧客トップページのホスト名とURLパスを
正 顧客トップページのホスト名とURLパスを

Chapter 11

P.213 本文下から4行目

誤 すでに説明しました。
正 218ページの本文2行目以降で説明します。

原稿の削除または入れ替えに伴う編集ミス。

Chapter 13

P.270 本文4行目

誤 32行目で定数TIMEOUTを使用しています。
正 35行目で定数TIMEOUTを使用しています。

P.270 本文9行目

誤 33行目では
正 36行目では

P.270 本文10行目

誤 35〜37行が
正 38〜40行が

Chapter 14

P.293 コマンド実行例

誤 rails g controller admin/staff_events
正 bin/rails g controller admin/staff_events

P.299 本文下から4行目

誤 職員mと結び付けられたStaffMemberオブジェクトを
正 職員mと結び付けられたStaffEventオブジェクトを

P.304 図14-8のキャプション

誤 ページネーション(1ページ目)
正 ページネーション(2ページ目)

Chapter 15

P.320 ソースコード 7,11行目

# 7行目
誤 NKF.nkf('-w -Z1', text).strip if text
正 NKF.nkf('-W -w -Z1', text).strip if text

# 11行目
誤 NKF.nkf('-w -Z1 --katakana', text).strip if text
正 NKF.nkf('-W -w -Z1 --katakana', text).strip if text

オプション -W は入力の文字コードがUTF-8であることを指定します。この指定がないとギリシャ文字の「α」などで誤変換が発生します。読者の方からの指摘により判明しました。

P.321 コード例

誤 NKF.nkf('-w -Z1', text).strip if text
   NKF.nkf('-w -Z1 --katakana', text).strip if text
正 NKF.nkf('-W -w -Z1', text).strip if text
   NKF.nkf('-W -w -Z1 --katakana', text).strip if text

P.321 表15-1

  • 第1行に「-W」と「入力の文字コードをUTF-8と仮定する」を挿入。

P.321 Memo

誤 '-w -Z1' を '-wZ1' のように
正 '-W -w -Z1' を '-WwZ1' のように

P.325 ソースコード 7行目

誤 NKF.nkf('-w -Z1', text).strip if text
正 NKF.nkf('-W -w -Z1', text).strip if text

P.330 第1のソースコード 9行目

誤 resource :account, except: [ :new, :create ]
正 resource :account, except: [ :new, :create, :destroy ]

P.338 演習問題 1. の正規表現

誤 /\A[\p{han}\p{hiragana}\p{katakana}\u{30fc}\p{alpha}]+\z/
正 /\A[\p{han}\p{hiragana}\p{katakana}\u{30fc}A-Za-z]+\z/

Unicodeの文字列を対象とする場合、\p{alpha} には、英語のアルファベットだけでなく、ギリシャ文字、アラビア文字、ひらがな、カタカナなどすべての表音文字が含まれます。

Chapter 16

P.347 第2のソースコード 6行目

誤 doc.send(tag_name, options) do
正 doc.method_missing(tag_name, options) do

訂正前のコードでは、tag_name の値が :select の時にエラーが発生します。

P.356 第2のソースコード 4行目

誤 m << decorated_label(name1, label_text, options)
正 m << label(name1, label_text,
     class: options[:required] ? 'required' : nil

decorated_label メソッドは、3ページ後(359 ページ)で定義されます。

P.357 第2のソースコード 17行目

読者の方から以下のような指摘がありました。①チェックボックスが1個しかないのに check_boxes という複数形のメソッド名を採用したのは変ではないか。②他のメソッドが full_name_block のように具体的な名前を持っているので、suspended_check_box のようなメソッド名にしてはどうか。確かにその通りです。実は、著者の脳内には、後で deleted とか regular といったフラグを追加するかも、という考えがあったので、このようなメソッド名にしました。結局この考えは実現しなかったのでメソッド名を訂正すべきところですが、正誤表に含めると読者の作業を増やすことになりますので、ここにメモとして残すのみとします。

P.363

最終行「次に、StaffMemberオブジェクト特有の…」の後ろで改ページ。

あるいは、第2のソースコードの 17 行目および 18 行目に、インデント幅が分かるような記号を加える。

読者の方から、YAMLではインデント幅に意味があるのでソースコードの途中で改ページすると読みにくい、というご意見をいただきました。

P.364 第2のソースコード 44行目

誤 m.div(class: 'error-message') do |m|
正 m.div(class: 'error-message') do

Chapter 17

P.379 ソースコード 1行目

誤 $(document).on('page:change'), ->
正 $(document).on('turbolinks:load'), ->

Turbolinks のバージョン 5 で行われた仕様変更により、この変更が必要になりました。ソースコード一式をダウンロードして動かす場合には、この修正をしないでください。

P.383 各所

見出し、本文、コード例に含まれる page:change をすべて turbolinks:load で置き換えてください。

P.385 ソースコード 1行目 

誤 $(document).on('page:change'), ->
正 $(document).on('turbolinks:load'), ->

Turbolinks のバージョン 5 で行われた仕様変更により、この変更が必要になりました。ソースコード一式をダウンロードして動かす場合には、この修正をしないでください。

Chapter 18

P.400 ソースコード 43 行目

誤 birthday: 60.years.ago.advance(seconds: rand(40.years)).to_date,
正 birthday: 60.years.ago.advance(seconds: rand(40.years.to_i)).to_date,

P.401 第3のソースコード 9行目

誤 resource :account, except: [ :new, :create ]
正 resource :account, except: [ :new, :create, :destroy ]

Chapter 19

P.438 第2のソースコード 19,23行目

# 19行目
誤 NKF.nkf('-w -Z1 --katakana', text).strip if text
正 NKF.nkf('-W -w -Z1 --katakana', text).strip if text

# 23行目
誤 NKF.nkf('-w -Z1', text).strip.gsub(/-/, '') if text
正 NKF.nkf('-W -w -Z1', text).strip.gsub(/-/, '') if text

P.438 第2のソースコード

  • 左端の行番号 18-2514-21 に振り直す。

P.440 本文下から2行目

誤 「2100/01/01」
正 「2100-01-01」

Chapter 20

P.471 第2のソースコード 19,23行目

# 19行目
誤 NKF.nkf('-w -Z1', text).strip.gsub(/-/, '') if text
正 NKF.nkf('-W -w -Z1', text).strip.gsub(/-/, '') if text

# 23行目
誤 NKF.nkf('-w -Z1', text).strip if text
正 NKF.nkf('-W -w -Z1', text).strip if text

P.477 第2のソースコード 10行目

誤 m << p.date_field_block(:birthday, '生年月日')
正 m << p.birthday_field_block(:birthday, '生年月日')

Chapter 21

P.505 ソースコード 41行目の前に下記コード(太字)を挿入

    rel = rel.distinct

P.506 小項「●Customerモデルの修正」の前に下記を挿入

41行目では検索結果から重複を取り除くためdistinctメソッドを用いています。

    rel = rel.distinct

この記述がないと、例えば、電話番号下4桁に「0000」を指定して検索した場合に「佐藤 一郎」という顧客が2件表示されてしまいます。なぜなら、この顧客は個人電話番号と自宅電話番号の下4桁がともに「0000」であるからです。なお、distinctメソッドの代わりに、別名のuniqメソッドを用いることもできます。

P.509 ソースコード

  • 左端の行番号 45-5646-57 に振り直す。