サービス

このサイトでは、Ruby on Rails 逆引きクイックリファレンスの正誤表、追加情報などを公開していきます。

書影

新たに見つかった誤り

P.186 Q*070 画面の枠組みを共通利用するには(レイアウト)

例) 複数個所に挿入できるレイアウト

<html>
  ...
  <body>
    ... 共通タイトル ...

    ... 共通メニュー ...

    <div id="sub_menues'>
      <%= yield :sub_menues %>
    </div>

    ... 共通のデザイン ...

    <div id="main">
      <%= yield %>
    </div>
  </body>
 </html>

例) 上記レイアウトに対応するアクションのテンプレート

<% content_for(:sub_menues) do -%>
  <%= link_to '新着', :action => 'new_arrivals' %> |
  <%= link_to 'お気に入り', :action => 'favourites' %>
<% end -%>

<p>
  ...メイン画面の出力 ...
</p>

例) 複数個所に挿入できるレイアウト

<html>
  ...
  <body>
    ... 共通タイトル ...

    ... 共通メニュー ...

    <div id="sub_menus'>
      <%= yield :sub_menus %>
    </div>

    ... 共通のデザイン ...

    <div id="main">
      <%= yield %>
    </div>
  </body>
 </html>

例) 上記レイアウトに対応するアクションのテンプレート

<% content_for(:sub_menus) do -%>
  <%= link_to '新着', :action => 'new_arrivals' %> |
  <%= link_to 'お気に入り', :action => 'favourites' %>
<% end -%>

<p>
  ...メイン画面の出力 ...
</p>
P.492 Q*196 ページキャッシュを使うには

* 1) 残念ながら専用のgeneraterは付属していませんがプラグインで追加することができます。次のコマンドでインストールできます。> ruby script/plugin install http://topfunky.net/svn/plugins/sweeper

* 1) 残念ながら専用のgeneratorは付属していませんがプラグインで追加することができます。次のコマンドでインストールできます。> ruby script/plugin install http://topfunky.net/svn/plugins/sweeper

P.493 Q*196 ページキャッシュを使うには
class BlogsController < ApplicationController
  caches_page :index, :show # ページキャッシュをする

  def destroy
    @blog = @blogger.blogs.find(params[:id])
    @blog.destroy
    expire_page :action => 'show', :blogger_name => @blogger.name, id => @blog.id
    expire_page :action => 'index', :blogger_name => @blogger.name

    redirect_to :action => 'index'
  end
  ...
end
class BlogsController < ApplicationController
  caches_page :index, :show # ページキャッシュをする

  def destroy
    @blog = @blogger.blogs.find(params[:id])
    @blog.destroy
    expire_page :action => 'show', :blogger_name => @blogger.name, :id => @blog.id
    expire_page :action => 'index', :blogger_name => @blogger.name

    redirect_to :action => 'index'
  end
  ...
end

第1刷の間違い

P.41 Q*007 Rubyを動かすには
class person
  def hello
    puts "hello"
  end
end
person = person.new
person.hello
class Person
  def hello
    puts "hello"
  end
end
person = Person.new
person.hello
P.45 Q*009 四則演算するには

※「丸めのためのメソッド」の表内の「to_i(改行)truncate」

※(改行)部分でレイアウト上改行されるのが正しい

P.68 Q*021 モジュールを定義するには
"「#{@title}」(#{@authors.join(', ')t})"
"「#{@title}」(#{@authors.join(', ')})"
P.128 Q*045 例外を共通的に処理するには

※フローのなかの上から2番目の分岐、「すべてローカル接続?」は誤り

ローカル接続?」が正しい

P.135 Q*048 URLと機能の対応付けをカスタマイズするには

'/good_by'というURLでLoginControllerのlogoutを呼ぶには、

map.connect 'good_by', :controller => 'users', :action => 'logout'

と記述します。

なお、ルートに名前を付けることもできます。次のように指定すると、good_by_pathというメソッドで、このルートに対応するパス('/good_by'など)を得ることができます。詳しくは次項を参照してください。

map.good_by 'good_by', :controller => 'users', :action => 'logout'

'/goodbye'というURLでLoginControllerのlogoutを呼ぶには、

map.connect 'goodbye', :controller => 'users', :action => 'logout'

と記述します。

なお、ルートに名前を付けることもできます。次のように指定すると、goodbye_pathというメソッドで、このルートに対応するパス('/goodbye'など)を得ることができます。詳しくは次項を参照してください。

map.goodbye 'goodbye', :controller => 'users', :action => 'logout'
P.136 Q*048 URLと機能の対応付けをカスタマイズするには

※コード例の掲載位置が間違っています

map.connect 'dogs/:action/:id', :controller => 'pets', :pet_type => 'Dog'
map.connect 'cats/:action/:id', :controller => 'pets', :pet_type => 'Cat'

■URLに暗黙のパラメータを追加してアクションに伝える

...

■URLに暗黙のパラメータを追加してアクションに伝える

また、特定のURLがリクエストされたときは、固定的なパラメータをアクションに伝えるということもできます。これによって、見た目上(URL上)は別の機能が、同じコントローラの同じアクションに集約されているという構造が作れます。

map.connect 'dogs/:action/:id', :controller => 'pets', :pet_type => 'Dog'
map.connect 'cats/:action/:id', :controller => 'pets', :pet_type => 'Cat'
P.137 Q*048 URLと機能の対応付けをカスタマイズするには

API仕様書

APIリファレンス

P.140〜P141 Q*049 特定の機能へのURLを作成するには

※3箇所、<%= ... が <% =... になっています。

<%= ... %>
P.142 Q*050 コントローラをRESTfulにするには

※「Rails 1.xの標準的なURL」の表のあと、Rails2.0の表の前の1文が抜けています。

Rails 1.xの標準的なURL

Rails2.0ではこれらの機能のI/Fを簡単にRESTfulにすることができます。次のような形になります。

Rails2.0のRESTfulなURLの例

P.148 Q*052 親子構造にあるモデルを扱うコントローラをRESTfulにするには
map.resources :projects do |project|
  article.resources :members, :name_prefix => nil
end
map.resources :projects do |project|
  project.resources :members, :name_prefix => nil
end
P.180 Q*069 テンプレートを記述するには

例) app/views/project/show.html.erb]

例) app/views/projects/show.html.erb]

P.188 Q*071 画面の一部を共通利用するには(部分テンプレート)

...次のような部品テンプレートを作ります。

...次のような部分テンプレートを作ります。

P.199 Q*077 リンクを出力するには

最初の引数には<a>タグで囲むキャプションを、次の引数にはURL報を指定します。

最初の引数には<a>タグで囲むキャプションを、次の引数にはURL情報を指定します。

P.239 Q*093 モデルクラスを作るには

admin_usersテーブルのスキーマ、AdminUserモデルで使えるアクセサの例が、表ではなくソース例のようになってしまっています

それぞれ表になるのが正しいです。

P.248 Q*095 レコードを参照するには
:from …… SQLのfrom句の内容を記述する指定しない場合はAtiveRecordモデルの関連づけられた...
:from …… SQLのfrom句の内容を記述する指定しない場合はActiveRecordモデルの関連づけられた...
P.255 Q*097 レコードを変更するには
Book.update(ids, values)    # 更新の実行
Book.update(ids, attributes)    # 更新の実行
P.256 Q*098 レコードを削除するには
  #4/1以前に登録されたデータを全て消す
  #4/1より前に登録されたデータを全て消す
P.260 Q*100 レコード数を数えるには
ratings_count = Rating.count(:score, :conditions => ["entry_id = ?", entry_id])e)

※ 末尾の'e)'が不要

ratings_count = Rating.count(:score, :conditions => ["entry_id = ?", entry_id])
P.262 Q*101 最小値・最大値・平均値・合計値を得るには
# 1週間以内に登録されたレーティングの中でscoreの平均値を得る
min = Rating.average(:score, :conditions => ["created_at >= ?", Date.today - 7])
# 1週間以内に登録されたレーティングの中でscoreの平均値を得る
avarage = Rating.average(:score, :conditions => ["created_at >= ?", Date.today - 7])
P.263 Q*101 最小値・最大値・平均値・合計値を得るには
# 1週間以内に登録されたレーティングの中でscoreの合計を得る
min = Rating.sum(:score, :conditions => ["created_at >= ?", Date.today - 7])
# 1週間以内に登録されたレーティングの中でscoreの合計を得る
sum = Rating.sum(:score, :conditions => ["created_at >= ?", Date.today - 7])
P.286 Q*112 モデルの内容をXMLで出力するには
<parent-id type="integer"><parent_id>
  ...
<parent-id type="integer">1<parent_id>
<parent-id type="integer"><parent-id>

  ...
<parent-id type="integer">1<parent-id>
P.291 Q*114 モデルクラス同士の共通処理をまとめるには
※291ページの最初のコード例で、2つのクラスの内容が1つの囲み内に入っています。また、技術的補足のところに不要なコード例が記述されています。

※Report、Projectのコードが別々の囲み内に記述されるのが正しいです。また、技術的補足の最後にあるコード例は不要です。

P.300 Q*118 1対多の関連を張るには

あるEmployeeオブジェクトに紐づいたOfficeモデルオブジェクトを得るには、関連名のメソッドを呼びます。

@office = employee.office(true)

あるEmployeeオブジェクトに紐づいたOfficeモデルオブジェクトを得るには、関連名のメソッドを呼びます。

@office = employee.office
P.300 Q*118 1対多の関連を張るには

これにより、idがemployee.office_idと一致するようなOfficeオブジェクトを取得できます。以後の参照ではemployeeにキャッシュされたOfficeオブジェクトが返されますが、引数にtrueを指定して関連を参照すると強制的に関連オブジェクトを取得しなおします。

@office = employee.office

これにより、idがemployee.office_idと一致するようなOfficeオブジェクトを取得できます。以後の参照ではemployeeにキャッシュされたOfficeオブジェクトが返されますが、引数にtrueを指定して関連を参照すると強制的に関連オブジェクトを取得しなおします。

@office = employee.office(true)
P.305 Q*120 多対多の関連を張るには

※「1対多の関連を利用する」のクラス図のProjectMemberの属性が「projectuser_id」となっている

※「user_id」が正しい

P.312 Q*122 自由な関連名をつけるには

... 対応するクラスとは、has_many、has_oneの場合は自クラス、belongs_toの場合は相手クラスを指示する。...

... 対応するクラスとは、has_many、has_oneの場合は自クラス、belongs_toの場合は相手クラスを指す。...

P.322 Q*127 ポリモーフィック関連で同一視する複数モデル間の共通の処理をまとめるには
class Office < ActiveRecord::Base
  include WorkPlace
  has_many :work_place_costs, :as => :work_place
end
class Office < ActiveRecord::Base
  include WorkPlace
  has_many :employees, :as => :work_place
end
P.322 Q*127 ポリモーフィック関連で同一視する複数モデル間の共通の処理をまとめるには
class Factory < ActiveRecord::Base
  include WorkPlace
  has_many :work_place_costs, :as => :work_place
end
class Factory < ActiveRecord::Base
  include WorkPlace
  has_many :employees, :as => :work_place
end
P.325 Q*128 ポリモーフィック関連の苦手とする処理は
class Tag < ActiveRecord::Base
  has_many :taggings
    has_many :diary_entries, :through => :taggings, :source => :taggable,
      :source_type => 'DiaryEntry'
end

*インデントのずれ

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :diary_entries, :through => :taggings, :source => :taggable,
    :source_type => 'DiaryEntry'
end
P.327 Q*129 関連に独自メソッドを定義するには
  • proxy_target - 関連づけられたオブジェクト(has_manyやhas_and.belongs_to_manyではコレクション)を返します。
  • proxy_target - 関連づけられたオブジェクト(has_manyやhas_and_belongs_to_manyではコレクション)を返します。
P.345 Q*137 順序付きリスト構造を作るには
class ShoppingItem < ActiveRecord::Base
  belongs_to :shopping_plan_list
  acts_as_list :scope => :shopping_plan_list
end
class ShoppingItem < ActiveRecord::Base
  belongs_to :shopping_plan
  acts_as_list :scope => :shopping_plan
end
P.348 Q*138 既存のデータベースを使うには
execute "ALTER TABLE company ADD postal_code CHAR(7)
execute "ALTER TABLE company ADD postal_code CHAR(7)"
P.354 Q*141 Scaffoldとは

以下の例では、後になってArticleモデルにused_idというカラムを足したため、Scaffoldを作り直しています。マイグレーションファイルは自動作成せず、自分で作ることにしています(詳細は省きます)。

> ruby script/generate scaffold Article title:string body:text user_id:integer --skip-
migration

以下の例では、後になってArticleモデルにuser_idというカラムを足したため、Scaffoldを作り直しています。マイグレーションファイルは自動作成せず、自分で作ることにしています(詳細は省きます)。

※コマンドラインは1行で書きます

> ruby script/generate scaffold Article title:string body:text user_id:integer 
    --skip-migration
P.382 Q*151 RJSで基本的なコードを記述するには
# 値を表示
alert(page['user_name'][:value])
# 値を表示
page.alert(page['user_name'][:value])
P.383 Q*151 RJSで基本的なコードを記述するには

pageオブジェクトを使って、JavaScriptのクラスのstaticメソッドを呼び出すことができます。例えば、prototype.jsに用意されているForm.Element.serializeは(element)次のようにして呼び出せます。

pageオブジェクトを使って、JavaScriptのクラスのstaticメソッドを呼び出すことができます。例えば、prototype.jsに用意されているForm.Element.serialize(element)は次のようにして呼び出せます。

P.402 Q*161 表示項目をその場で編集できるようにするには

_place_editingのカスタマイズ

in_place_editingのカスタマイズ

P.485 Q*194 プロファイルを取るには

以下の例では、10回実行されます。

> ruby script/performance/benchmarker 10, 'Project.find(:all)'

以下の例では、10回実行されます。

> ruby script/performance/benchmarker 10 'Project.find(:all)'

P.526 索引【E】

execute → 241

execute → 245,349,427,430