『基礎Ruby on Rails』 読者サポートページ

2008/01/31

このページは、弊社監修の『基礎Ruby on Rails』(2007年10月、インプレスジャパン刊)の読者サポートページです。『改訂新版 基礎Ruby on Rails』(2012年3月)についての情報をお探しの方はこちらへ。

読者の皆様からお寄せいただいた質問(一部、筆者による想定質問を含みます)に「Q&A」形式でお答えいたします。

なお、本書の出版後に見つかった記述の誤りに関しては、正誤表をご覧ください。

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

関連記事

Q & A

Q. 38ページからの説明に従って新規のRailsアプリケーションを作成して、WEBRickを起動しました。 ブラウザで「Welcome aboard」のページは表示できましたが、44ページのエラー画面が表示されません。 WEBRickのログを見ると「ArgumentError: Anonymous modules have no name to be referenced by」というエラーが出ています。

A. Railsアプリケーションのルートディレクトリから更に script ディレクトリに移ってから、「ruby server」コマンドでWEBRickを起動していませんか。 この方法でも静的なページを表示することができますが、動的なページを表示しようとすると、「ArgumentError」が発生します。

Railsルートディレクトリ(本書44ページのケースでは、C:\rails\asagao)において「ruby script\server」コマンドでWEBRickを起動してください。

Q. 166ページから179ページで説明されている LessonController のソースコードとそれに対応するテンプレートが、付属CD-ROMに収録されていません。

A. 大変申し訳ございません。手違いにより、付属CD-ROMの chapter3 ディレクトリの中身に一部欠落がございました。 このディレクトリ全体をZIP形式でまとめましたので、お手数をお掛けしますが次のリンクよりダウンロードし、展開してご利用ください。 (読者の方から「Lesson用のページをブラウザで開くと文字化けする」とのご指摘があったのを受け、2007年12月22日に一部修正したものをアップロードしました。)

Q. 224-225ページのコラム「データベースの確認」で「set character set sjis;」コマンドを実行しておくと漢字やひらがなが文字化けしない、と書いてありますが、その通りやっても文字化けします。

A. データがUTF-8で格納されていない可能性があります。 207ページを参照して、config\database.yml に「encoding: utf8」の行を追加してあるかどうか確認した上で、フィクスチャの投入をやり直してみてください。

Q. Linux 環境で学習しています。 ruby script/server で WEBRick を起動し、サンプルサイトのトップページを開くと、"No such file or directory - /tmp/mysql.sock" というエラーメッセージが表示されます。

A. config\database.yml の「host: localhost」をすべて「host: 127.0.0.1」に変更して、WEBRick を再起動してみてください。

Q. 本書は Rails 1.2.3 に基づいていますが、それ以降のバージョンで記述内容が変わった点はありますか。

A1. Rails 1.2.4 で「RESTフル」なルーティングを使用した場合の URL のフォーマットが変更され、セミコロン(;)の代わりにスラッシュ(/)を使用することになりました。 たとえば、MembersControlleredit アクションに対応する URL のパスは、Rails 1.2.3 までは「/members/123;edit」でしたが、1.2.4 以降は「/members/123/edit」となります。 Rails 1.2.4 以降で開発する場合は、Chapter 9「REST」の記述を読む際に URL 中のセミコロンをすべてスラッシュで置き換える必要があります。

なお、CD-ROM の chapter9 ディレクトリに収録したアプリケーションは、Rails 1.2.4 以降の Rails 1.2.x でも動作しますが、 上記の変更によってルーティングの動作を調べる機能テスト(AccountControllerTest, BlogEntriesControllerTest, MembersControllerTesttest_routing)が失敗します。

A2. Rails 2.0 で paginate メソッドが廃止され、ページネーション機能がプラグインとして提供されることになりました。 このため、Rails 1.2.4 以降では、paginate メソッドを使用していると、「DEPRECATION WARNING: paginate is deprecated and will be removed from Rails 2.0」という警告が表示されます。 本書では、app/controllers/admin/articles_controller.rb の15行目で paginate メソッドが使用されています。

A3. Rails 2.1 のジェネレータには、クラス名の衝突を検知する仕組みに不具合があります。 そのため、本書のように ruby script¥generate controller articlesArticlesController を作成した後に、ruby script¥generate controller admin::articlesAdmin::ArticlesController を作成しようとするすると、次のようなエラーメッセージを表示して停止してしまいます。

The name 'Admin::ArticlesHelper' is either already used in your application or reserved by Ruby on Rails.
Please choose an alternative and run this generator again.

この問題は、既に Ticket #545 としてバグ報告されていますので、将来的には解消されるでしょう。現時点では、一時的に app/helpers フォルダの members_helper.rb を別の場所に退避させ、Admin::ArticlesController を作った後に元に戻せば、とりあえず問題を回避できます。

Q. 私のパソコンには既にバージョン 1.2.4 以降の Rails がインストールされています。どうすればいいですか。

A. まず、インストールされている Rails のバージョンのリストを調べてください。 コマンドプロンプトを開いて、gem list rails と入力します。 rails (2.0.2, 1.2.3) のように表示されれば、バージョン 2.0.2 と 1.2.3 がインストールされていることが分かります。 1.2.3 が表示されない場合は、gem install -v 1.2.3 rails と入力して Rails 1.2.3 をインストールしてください。

当面の間、本書の学習に専念するのであれば、いったん 1.2.4 以降の Rails をアンインストールするとよいでしょう。 バージョン 2.0.2 をアンインストールするコマンドは gem uninstall -v 2.0.2 rails です。

1.2.4 以降の Rails をアンインストールしたくない場合は、バージョンを指定して rails コマンドを実行する方法があります。 rails _1.2.3_ asagao のように rails の直後にバージョン番号をアンダーバーで囲んで指定します。 なお、asagao はアプリケーションの名前です。

Q. 206-209ページの説明に従ってデータベースの作成を試みましたが、「rake aborted!」というエラーメッセージが表示されて止まってしまいます。

A. config\database.ymlに追加した「encoding: utf8」の行頭に半角スペース2個が置いてあることを確認してください。 タブ文字や全角スペースでは正しく動きません。

これが原因でない場合は、rake db:create --trace と入力して、表示されたエラーメッセージをコピーしてメールで質問してください。

Q. 紹介されているクラスやメソッドのもっと詳しい使い方を調べる方法を教えてください。

A. RailsBrain.com にバージョン別の API ドキュメント(英語)が掲載されています。本書の対象である Rails v1.2.3 のドキュメントを参照してください。

Q. Ruby on Rails では、モデルクラスの名前は英語の単数形(ただし、Member のように大文字で始める)で、データベーステーブル名は複数形(members)になると説明されていますが、y で終わる単語(Category 等)や不規則変化をする単語(Child 等)はどうなりますか。

A. モデル Category のテーブル名は categories、モデル Child のテーブル名は children のように、英語の文法に沿って変化します。なお、モデル Person のテーブル名が people になる点は、間違いやすいので気をつけてください。

Q. P.175 で、link_to メソッドの第3引数にハッシュでオプションを指定できると書いてあります。その例として次のような使用例が掲載されています:

<p><%= link_to('ステップ1', { :action => 'step1' },
    :confirm => '本当に移動しますか?') %></p>

他方、同じページの上方に掲載されている修正前の LIST では、次のようになっています。

<p><%= link_to('ステップ1', :action => 'step1' %></p>

なぜ、オプションを指定した場合は :action => 'step1' の周囲を中括弧 { } で囲む必要があるのでしょうか。また、どうして、ハッシュであるメソッドの第3引数を中括弧で囲まなくてもいいのでしょうか。

A. メソッドの最後の引数にハッシュを渡す場合は、ハッシュを囲む中括弧を省略できるというルールが、Ruby 文法にあるためです。P.123 の囲み記事を参照してください。

Q. TeraPad を使って学習しています。書籍に書いてある通りアプリケーションを作成しましたが、ブラウザでアクセスすると次のようなエラーが出ます。この原因は何でしょうか。

SyntaxError in MainController#index
app/controllers/main_controller.rb:5: syntax error, unexpected kEND, expecting $end

A. TeraPad を使って日本語の文字を含む Ruby のソースコードを編集する場合、保存時の文字コードとして「UTF-8」ではなく「UTF-8N」を選ぶ必要があります。上記のようなエラーが出る原因の1つですので、まず文字コードを確認してください。

Q. 新規の Rails アプリケーションを作成して、WEBRick を起動しました。ブラウザで確認すると「Welcome aboard」のページは表示されましたが、その他のページでは次のようなエラーが出ます。この原因は何でしょうか。

MissingSourceFile in MainController#index
no such file to load -- sqlite3

A. バージョン 2.0.2 以降の Rails を使っていることが原因と考えられます。gem プログラムを使ってインターネットからインストールすると、最新版の Rails になります。

Rails 2.0.2 以降、デフォルトのデータベース管理システムが MySQL から SQLite3 に変更されました。上記のエラーメッセージは SQLite3 用のパッケージがインストールされていないことを示しています。詳しくは、SQLite3 - Ruby on Rails 2.0 日記をご覧ください。

対処方法としては、いったん Rails をアンインストールして、本書付属の CD-ROM からインストールし直すことをお勧めします(学習の間だけの辛抱です!)。

どうしても最新版を使いたい場合は、rails -d mysql asagao のように -d オプションを付けてアプリケーションを作成してください。あるいは、p.206-209 の説明に従って、config/database.yml を書き換え、データベースを作成してください(config/database.yml の中身はかなり異なるので、CD-ROMからコピーすることをお勧めします)。

Q. トップページを表示すると次のようなエラーメッセージが表示されます。何が原因ですか。そして、どう対処すればいいですか。

NoMethodError in Main#index
undefined method `length' for #<Enumerable::Enumerator:0xb676c440>

A. バージョンが 1.8.7 より新しい Ruby を使用していることが原因です。Ruby をアンインストールし、改めて Ruby 1.8.6 をインストールしてください。

最新の Ruby を使いたい場合は、次のコードを config/environment.rb の末尾に追加してください。

module ActionView
  module Helpers
    module TextHelper
      def truncate(text, length = 30, truncate_string = "...")
        if text.nil? then return end
        l = length - truncate_string.chars.to_a.size
        (text.chars.to_a.size > length ? text.chars.to_a[0...l].join + truncate_string : text).to_s
      end
    end
  end
end

参考資料: undefined method `length’ for Enumerable Enumerator on text_helper.rb:50:in `truncate’

Q. p.240 の「会員名簿」にはソート順を「背番号順」と「名前順」で切り替える機能があります。しかし、「名前順」リンクをクリックすると、「背番号順」リンクも「名前順」リンクも灰色表示に変わってしまいクリックできません。なお、Rails のバージョンは 2.2 です。

A. link_to_unless_current メソッドの振る舞いが、本書が対象としている Rails 1.2.3 と Rails 2.2 で異なるのが原因です。

Rails 1.2.3 では、ある URL が current、すなわち「現在表示しているページのURLと同じ」であるかどうかを判定する時に、現在の URL に含まれる ? 以降の部分も含めて比較していましたが、Rails 2.2 では ? 以降を削除した上で比較します。そのため、「名前順」で表示した際に「背番号順」のURL も current であると判定されてしまったのです。

Rails 1.2.3 にダウングレードしていただければ問題は解消します。

[参考] Rails 2.2 でこの機能を正しく動かす手順は次の通り。
  • config/routes.rb に次の行を追加します。
    map.connect 'members/byname', :controller => 'members', :action => 'index', :sort => 'byname'
    
  • app/views/members/index.rhtml の 12-13 行を次のように修正します。
          <%= link_to_unless_current '背番号順',
                :action => 'index', :sort => nil %> |
    

Q. NEW 214ページで rake db:migrate を実行すると rake aborted! Bad file descriptor - connect(2) というエラーが発生します。

A. 以下の手順で gem ライブラリ mysql をアップグレードしてから、rake db:migrate を再実行してください。

  1. rubygems-1.4.2.zip をダウンロードし、適当なフォルダ(C:¥workなど)に展開します。
  2. コマンドプロンプトを開き、展開したフォルダに移動し、ruby setup.rb コマンドを実行します。
  3. さらに gem install mysql コマンドを実行します。

本書の内容についてご質問は、kiso-rails@oiax.jp までメールでお送りください。 返信には、しばらくお時間をいただく場合がございます。また、本書の内容を越える質問にはお答えしかねます。あらかじめご了承ください。