『基礎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 = { |
|||
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までメールでお送りください。
誤字・誤記のご指摘に関しては、どのような些細なものでも歓迎いたします。
返信には、しばらくお時間をいただく場合がございます。
なお、本書の内容から大幅に外れる質問には回答をお断りする場合もございます。あらかじめご了承ください。