Ruby on Rails逆引きクイックリファレンス
このサイトでは、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 関連に独自メソッドを定義するには | |
| 誤 |
|
| 正 |
|
| 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 |







