『基礎Ruby on Rails』 初版第1刷 正誤表

2008/03/07

弊社監修の『基礎Ruby on Rails』初版第1刷 (インプレスジャパン刊)の内容に誤りが見つかりましたので、正誤表を掲載いたします。特に重要な項目には★印を付しました。

その他の版・刷については正誤表一覧をご覧ください。

また、付録CD-ROMにおいて chapter3 ディレクトリの中身に一部欠落がございました。このディレクトリ全体をZIP形式でまとめましたので、次のリンクよりダウンロードしてください。

この正誤表のPDF版は次のリンクよりダウンロードできます。

読者の皆様さまにご迷惑をお掛けしたことを深くお詫びいたします。

なお、読者サポートページも合わせてご参照ください。

Chapter 1 イントロダクション

p.19 図の「M(モデル)」 デーベース
データベース
p.21 第2段落 美しいコードが書けるからRailsを選んだ
美しいコードが書けるからRubyを選んだ
p.33 コマンド入力例1の1行目 C:¥Documents and Settings¥Taro>d:
C:¥Users¥Taro>d:
p.33 箇条書きの最後の項目 uby on Rails本体
Ruby on Rails本体
p.35 下から2行目および1行目 (2ヶ所) Charactor
Character
p.35 下から1行目 utf-8
utf8
p.38 コマンド入力例1の1行目 C:¥Documents and Settings¥Taro>cd ¥
C:¥Users¥Taro>cd ¥
p.39 本文下から2行目 …が表示されます。初期設定では…
…が表示されます。表示されない場合は、URLを「http://127.0.0.1:3000/」に変えてみてください。初期設定では…
p.42 コマンド入力例1の1行目 C:¥rails¥test>
C:¥rails¥asagao>
p.42 第2段落の1行目 フォルダmain¥app¥controllersを開いてみましょう。
フォルダapp¥controllersを開いてみましょう。
p.45 Hint すべて文字コードをUTF-8にしてください。
すべて文字コードをUTF-8(TeraPadをお使いの場合UTF-8N)にしてください。
p.45 下から4行目末尾 main¥app¥controllersの下の...
app¥controllersの下の...
p.47 LISTの直前の行 :aciton
:action

Chapter 2 Rubyの基礎を学ぼう

p.56 表の下から1行目の左列 message::
Message
p.56 表の下から1行目の右列 114ページ参照
111ページのHINT参照
p.60 表の下から2行目の右列 NNは8進数
NNNは8進数
p.75 上から3行目 言語やJava
C言語やJava
p.78 Hintの1-2行目 ...必要はあません。...
...必要はありません。...
p.128 Listの5行目 elsif
else

Chapter 3 コントローラとビュー

p.156 ソースコード1の3行目 end def
end
p.157 HINT「requestオブジェクト」の2行目 request.remoteip
request.remote_ip
p.165 入力例 script/generate
script¥generate
p.173 LISTのファイル名 lesson_helper.rhtml
lesson_helper.rb
p.173 HINT「Timeクラス」の2行目 t = Time(2007, 6, 28, 18, 15, 30)
t = Time.local(2007, 6, 28, 18, 15, 30)
p.177 LIST, RESULT およびソースコードの1行目 (3ヶ所) Powerd by
Powered by
p.177 本文の1行目 app¥public¥images
public¥images
p.190 LIST 中央付近 ...
</ul>
</div>
<% 3.times do |x| %>
...
...
</ul>
<% 3.times do |x| %>
...
p.192 LISTのファイル名 ...¥_menu_bar.rhtml)
...¥_menu_bar.rhtml
p.193 LISTのファイル名 ...¥application_helper.rb)
...¥application_helper.rb
p.194 コマンド入力例 C:¥rails¥club>ruby script¥server
C:¥rails¥asagao>ruby script¥server

Chapter 4 データベースとモデル

p.209 本文2行目 CD-ROMのchapter4¥club¥lib¥tasksの下
CD-ROMのchapter4¥lib¥tasksの下
p.213 LIST の2-3行目 def self.up
    t.column :member_number, :integer,
def self.up
  create_table :members do |t|
    t.column :member_number, :integer,
p.225 コラム「scaffoldの利用」の入力例 script/generate
script¥generate
p.225 コラム「scaffoldの利用」の入力例 members
member
p.226 画面表示 Editing members
Editing member
p.229 本文中央付近 :conditionに指定できるのは
:conditionsに指定できるのは
p.235 サブセクション「7つのアクション」の2行目 destory
destroy
p.239 1つ目のLISTのファイル名 chapter4¥models¥member.rb
chapter4¥app¥models¥member.rb
p.243 LIST の1行目 MembersController < ApplicationController
ApplicationController < ActionController::Base

Chapter 5 MVCの連携

p.270 1つ目のコードの3行目 :message => '記入されていません。'
:message => 'が記入されていません。'
p.271 表の7行目「validates_inclusion_of」の「機能」 値が範囲外であることを検証
値が範囲内であることを検証
p.271 表の8行目「validates_length_of」の「オプション」 :maxmum
:maximum
p.278 第2段落の末尾 …で囲みます。
…で囲み、直ちにCommonモジュールをincludeします。
p.278-279 1つ目のLISTの末尾     (略)
    end
end
    (略)
    end
  end

  include Common
end
p.279 サブセクション「Admin::MainController」の2行目 Admin::MembersControllerと
Admin::MainControllerの
p.279 最も下の LIST (1-2行目) <% @page_title = '管理ページ' %->
<ul>
<% @page_title = '管理ページ' %->
<div id ="main">
<h1><%= h(@page_title) %></h1>
<ul>
p.279 最も下の LIST (末尾) </ul>
</ul>
</div>
p.282 LIST (下から2行目) { :method => :delete, ...
{ :method => :post, ...
p.288 下から2行目 Admin::MemberController
Admin::MembersController
p.291 1番目のLISTのファイル名 chapter5¥club¥app¥...
chapter5¥app¥...
p.293 LISTの3行目 :message => 'が間違っています。',
:message => 'の書式が不正です。',

Chapter 6 テスト

p.316 下から1行目 body:Body
body:BODY
p.325 2番目のLIST (ページの最下行) @sets_expired_at = checked.to_i
@sets_expired_at =
  [true, 1, '1'].include?(checked)
p.326 本文1-2行目 test_validation_on_expired_at1メソッドで
test_validation_on_expired_at2メソッドで
p.329 囲みの中のソースコード def self.current_articles(category)
def self.current_articles(place)
p.333 ソースコード2の2行目 :id => 2,
{ :id => 2 },
p.338-340 LISTのファイル名(4箇所) chapter6¥test¥functional¥main_controller.rb
chapter6¥test¥functional¥main_controller_test.rb
p.343 囲みの中のコマンド入力 ruby script¥generate controller admin::articles
ruby script¥generate controller admin/articles
p.345 RESULTの表
「掲載場所」の列
top
news
activities
notices
top
news
activities
notices
トップページ
ニュース
私たちの活動
お知らせ
トップページ
ニュース
私たちの活動
お知らせ
p.346 1番目のLIST option ? option[1] : '不明'
option ? option[0] : '不明'
p.347 RESULTの表
「掲載場所」の行
top
トップページ
p.354 3番目のLISTの3行目 :redirect_to => { :action => :'index'}
:redirect_to => { :action => :index}
p.355 コラムの本文1行目 articlesコントローラ
ArticlesController
p.355 コラムの本文下から4行目 jsファイルに
4つのJavaScriptファイル(application.js、prototype.js、effects.js、controls.js)に
p.355 コラムの本文下から3行目 自分でjsファイルにスクリプトを追加するときは、application.jsに記述すれば、javascript_include_tagメソッドで取り込まれます。
アプリケーション独自のJavaScriptコードを追加するときは、application.js内に記述し、上記の方法で取り込むとよいでしょう。prototype.js以下の3つのファイルはAjaxやDOM操作を実現するためのライブラリですので中身を変更しないでください。

Chapter 7 コントローラとビュー(応用編)

p.367 本文の1行目 「session[:名前]」
「session[:データ名]」
p.369 LISTのファイル名 chapter7¥migrate¥...
chapter7¥db¥migrate¥...
p.370 LISTのファイル名 chapter7¥fixtures¥...
chapter7¥db¥fixtures¥...
p.370 LISTの4行目 administrator: <%= idx == 1 ? true : false %>
administrator: <%= idx == 1 ? "true" : "false" %>
p.370 本文下から2行目 コマンドプロンプトで…
(hashed_passwordメソッドを実装してから)コマンドプロンプトで…
p.373 LISTのファイル名 chapter7¥club¥app¥...
chapter7¥app¥...
p.377 1つ目のLISTのファイル名 ...¥admin/main_controller.rb
...¥admin¥main_controller.rb
p.379 先頭のRESULTの前に追加
属性が増えたのでMemberモデルの定数REAL_ATTRIBUTE_NAMESに項目を追加します(「画像」属性は後で出てきます)。

LIST chapter7¥app¥models¥member.rb
REAL_ATTRIBUTE_NAMES = {
  # 中略
  :remarks => '備考',
  :login_name => 'ログイン名',
  :password => 'パスワードの変更',
  :administrator => 'サイト管理者',
  :uploaded_image => '画像'
}
p.380 2つ目のLISTの2行目 :furigana, :email, ...
:furigana, :birthday, :email, ...
p.380 3つ目のLISTのファイル名 chapter7¥app¥layouts¥...
chapter7¥app¥views¥layouts¥...
p.384 下から2行目 Admin::Membersコントローラ
Admin::MembersController
p.385-387 LISTのファイル名(4箇所) chapter7¥club¥test¥...
chapter7¥test¥...
p.392 LISTのファイル名 ...¥my_format/init.rb
...¥my_format¥init.rb
p.398 LISTのファイル名 ...¥mobile/base.rb
...¥mobile¥base.rb
p.400 本文下から2行目と3行目の間に挿入
config¥routes.rb を開いて、コメント行「# 基本のURLパターン」の上に次の1行を追加してください。
map.connect 'mobile', :controller => 'mobile/main'

p.404 HINT「複数の戻り値を返すメソッド」のソースコード a = n.split(',') return
a[0], a[1]
a = n.split(',')
return a[0], a[1]
p.406 ソースコードの次の行 Admin::Membersコントローラ
Admin::MembersController
p.408 LISTのファイル名 chapter7¥club¥app¥...
chapter7¥app¥...
p.411 LISTのファイル名 chapter7/club/views/main/news.rhtml
chapter7¥views¥main¥news.rhtml
p.416 LISTのファイル名 ...¥member_controller.rb
...¥members_controller.rb
p.417 LIST(2つとも)の下から3行目 :size => "96x128"
:size => "135x180"
p.417 本文下から2行目の直前に追加
また、表示を整えるために、表の「生年月日」から下の5行について <td> を <td colspan="2"> に変更します。
p.418 サブセクション「画像のアップロード」の1行目 Admin::Membersコントローラ
Admin::MembersController
p.419 LISTのファイル名 ...¥members/new.rhtml
...¥members¥new.rhtml

Chapter 8 データベースとモデル(応用編)

p.428 右の3行目から左の2行目への矢印
右の3行目から左の1行目への矢印
p.430 1つ目のコード class Entry < ActiveRecord::Base
class Comment < ActiveRecord::Base
p.438 本文2行目 「engine.car = car」
「@engine.car = @car」
p.438 囲みの2行目 @car = engine.car
@car = @engine.car
p.448 2つ目のLISTの下から5行目 strftime("%Y-%m-%S")
strftime("%Y-%m-%d")
p.450 1-2行目 (3ヶ所) コントローラ
Controller
p.451 LISTのファイル名 ...¥blog_entry.rb
...¥blog.rb
p.456 本文第2段落 beforeフィルタのblock_non_membersメソッドで
beforeフィルタのresume_sessionメソッドで
p.460 LISTのファイル名(2箇所) chapter8¥club¥db¥...
chapter8¥db¥...
p.460 2番目のLISTの7行目 footprint<%= i %>a:
footprints<%= i %>a:
p.465 コラム「has_many :throughを使ったリレーションシップ」中のソースコード class Blog < ActiveRecord::Base
  has_many :visitors, :through => :footprints
class Blog < ActiveRecord::Base
  has_many :footprints
  has_many :visitors, :through => :footprints
p.465 コラム「has_many :throughを使ったリレーションシップ」本文 Footprintsモデル
Footprintモデル
p.466 コラム「has_many :throughを使ったリレーションシップ」本文(2ヶ所) Footprintsモデル
Footprintモデル
p.467 セクション見出し has_many_and_belongs_to
has_and_belongs_to_many
p.472 最後のLISTのファイル名 chapter8¥app¥models¥blog.rb
chapter8¥app¥models¥group.rb
p.473 LISTのファイル名 chapter8¥app¥controllers¥member_controller.rb
chapter8¥app¥controllers¥members_controller.rb
p.474 1つ目のLISTのファイル名 chapter8¥app¥controllers¥member_controller.rb
chapter8¥app¥controllers¥members_controller.rb
p.474 最後の段落の前に挿入
サイドバー用のテンプレートをレイアウトに埋め込みます。

LIST chapter8¥app¥views¥members¥index.rb
<% @page_title = '会員名簿' -%>
<% @page_title = h(@query + ' の検索結果') if @query -%>
<% @page_title = "会員名簿(#{@group.name})" if @group -%>
<% @side_bar_template_name = 'side_bar' -%>
(以下、略)
LIST chapter8¥app¥views¥members¥show.rb
<% @page_title = @member.full_name + ' の詳細' -%>
<% @side_bar_template_name = 'side_bar' -%>
(以下、略)
p.483 LISTのファイル名 chapter8¥club¥app¥...
chapter8¥app¥...
p.486 1行目 Booksコントローラ
BooksController

Chapter 9 REST

p.498 箇条書きの各項目 (6ヶ所) コントローラ
Controller
p.500 セクション見出し Admin::Groupsコントローラ
Admin::GroupsController
p.501 表のキャプション Admin::MembersController
Admin::GroupsController
p.512 本文3-4行目 IDの指定は行いません。
idの指定は行いません。
p.514 本文1行目 Accountコントローラ
AccountController
p.514 1つ目のLISTのファイル名 chapter9¥models¥...
chapter9¥app¥models¥...
p.514 2つ目のLIST
# 会員情報の更新
def update
...
# 新規作成
def create
  @member = Member.new(params[:member])
  @member.administrator =
    params[:member][:administrator]
  @member.player = params[:member][:player]
  (中略)

# 会員情報の更新
def update
...

Appendix C Rubyのクラス・メソッド一覧

p.527 表の下から3行目 テラバイト数(1024ギガバイト)を返す。
テラバイト数(1024ギガバイト)を返す。terabyteメソッドは別名。
p.527 表の下から2行目 数値×週の秒数を返す。terabyteメソッドは別名。
数値×週の秒数を返す。weekメソッドは別名。
p.546 上の表の2行目 月(1月は1、2月は2、・・・)。
月(1月は01、2月は02、・・・)。

付属 CD-ROM

chapter7&;app&;views&;admin&;members&;show.rhtml 23行目
chapter8&;app&;views&;admin&;members&;show.rhtml 24行目
chapter9&;app&;views&;admin&;members&;show.rhtml 24行目

    <td rowspan="6" style="text-align:center">

    <td rowspan="5" style="text-align:center">

chapter7&;app&;views&;admin&;members&;show.rhtml 50行目
chapter8&;app&;views&;admin&;members&;show.rhtml 51行目
chapter9&;app&;views&;admin&;members&;show.rhtml 51行目

    <td><%= @member.birthday.strftime('%Y/%m/%d') %></td>

    <td colspan="2"><%= @member.birthday.strftime('%Y/%m/%d') %></td>

chapter8&;app&;views&;blog_entries&;new.rhtml
chapter9&;app&;views&;blog_entries&;new.rhtml

<% @page_title = 'ブログ記事の作成' -%>
<% @side_bar_template_name = 'side_bar' -%>
<div id="main">
<h1><%= h(@page_title) %></h1>

<div class="command-box">
<%= link_to(@current_user.blog.title, :action => 'index',
      :blog_id => @current_user.blog.id) %>
</div>

<%= render :partial => 'errors' -%>

(以下、略)

<% @page_title = 'ブログ記事の作成' -%>
<% @side_bar_template_name = 'side_bar' -%>
<div id="main">
<h1><%= h(@page_title) %></h1>

<%= render :partial => 'errors' -%>

(以下、略)

5-9行目を削除してください。この部分は本来不要であると同時に、アプリケーションに不具合を引き起こします。まだ一度もブログを投稿していないユーザーがこのページを表示すると @current_user.blog が nil になるため、例外 NoMethodError が発生します。


chapter9&;app&;controllers&;admin&;members_controller.rb

(前略)
  # 新規作成
  def create
    @member = Member.new(params[:member])

    if @member.save
(後略)

(前略)
  # 新規作成
  def create
   @member = Member.new(params[:member])
    @member.administrator = params[:member][:administrator]
    @member.player = params[:member][:player]

    if @member.save
(後略)

Member モデルの attr_protected に administrator および player フィールドを指定したため、会員の新規作成においても明示的に値を格納する必要があります。


chapter8&;app&;helpers&;mobile&;blog_entries_helper.rb
chapter9&;app&;helpers&;mobile&;blog_entries_helper.rb

module Mobile::BlogsHelper
end

module Mobile::BlogEntriesHelper
end

chapter9&;test&;functional&;account_controller_test.rb 86 行目

def test_update2

def test_update3

2007年10月24日 (2010年8月14日更新)
黒田 努
佐藤 和人
株式会社オイアクス

本書の内容についてご質問、ご感想、ご批判を、kiso-rails&;oiax.jpまでメールでお送りください。
誤字・誤記のご指摘に関しては、どのような些細なものでも歓迎いたします。
返信には、しばらくお時間をいただく場合がございます。
なお、本書の内容から大幅に外れる質問には回答をお断りする場合もございます。あらかじめご了承ください。