「はじめてのRuby on Rails3」サポートページ

このページは「はじめてのRuby on Rails3」(工学社刊、ISBN978-4-7775-1563-9)のサポートページです。


関連トピック:UbuntuにRailsをインストールしてみよう

「Ubuntu Desktop 11.10」に、Railsをインストールする方法を掲載しました。なかなかの作業ですが、その過程で、Ubuntuの操作法をいろいろ学ぶことができます。
「UbuntuでRails3.2.3」を御覧下さい。

関連トピック:openSUSEにRailsをインストールしてみよう

「openSUSE12.1」に、Railsをインストールする方法を掲載しました。上記で得た知識を元に行った作業なので簡単そうに見えますが、あくまで上での苦労があったからこそのことです。
「openSUSEでRails3.2.3」を御覧下さい。

関連トピック:筆者のうっかり報告 "Can't initialize a new Rails application..."

最近、筆者がRails3でやってしまった、うっかりエラーです。なんらかのミスでホームフォルダにRailsプロジェクトの中身を展開してしまい、上記のエラーを起こしてしまいました。
詳細はこちら。

重要事項

Can't mass-assign protected attirutesのエラー

Rails 3.2.3など最近のRailsにおいて、本書の方法がそのまま実践できない問題です。「Rails3のアップデートに伴うサポート事項」を御覧下さい。

「sqlite3-ruby」が「sqlite3」に

Ruby on Railsで必要な「SQLite3のドライバ」-本書84ページ-のインストールにおいて、gemコマンドを実行例3-10のように
gem  install sqlite3-ruby
とやりますと、「sqlite3-ruby-1.3.3」がインストールされますが、現在このバージョンが古くなり、不具合を起こす恐れがあります。
最近の「RubyのSQLite3のドライバ」は、以下のコマンドでインストールように変更されています。
gem install sqlite3
インストールするプログラム(モジュール)名が「sqlite3-ruby」から「sqlite3」に変更されたのですが、
新しいコマンドにより新しいバージョン、かつ名前も新しく 「sqlite3-1.3.4-x86-mingw32」 というものがインストールされます。
まさか前の名前が新しいバージョンに通用しなくなるとは筆者もショックを欠かせませんが・・・転居後の郵便でさえ1年は有効なのに・・・、こちらの新しい名前でインストールをしてみてください。

Ruby Installer for Windowsの問題

2011年11月の状況 2011年11月あたりから、WindowsにRuby on Railsをインストールするのはややこしくなってきました。というのも、Railsの機能が増えるに従って、Railsが必要とする他のRubyプログラムが多くなり、それらの中に、RubyだけではなくCでも書かれているプログラムが出て来たのです。
そのようなプログラムをインストールするためのツールが「DevKit」です。Windows用Ruby「Ruby Installer」を作ってくれている人たちが作ってくれたのです。この使い方については、以下の別ページに詳細を載せましたので参考にしてください。

DevKitを用いて、Railsインストールのエラーを解決する

2011年10月の状況 *この問題は、上記の方法でRubyの最新版をインストールすることにより解決されました。 2011年10月時点のRails3.1.0自体は、Ruby1.8.7にも対応しています(Mac OS XのRuby1.8.7をお使いの方は、ゆえに問題ないと思います)。
しかし、Windows版のRubyである「Ruby Installer for Windows」のほうで、Railsがうまく動かない問題があります。
本書付録の「Ruby 1.8.7-p302」をはじめ、最近の「Ruby 1.8.7-p352」でも、Railsアプリの作成の際エラーが出るようです。
現在公開中のRuby 1.9.2 用インストーラ「Ruby 1.9.2-p290」では問題なく作業できます。

RubyInstaller for Windowsのダウンロード・ページは、以下のURLにあります。
http://rubyinstaller.org/
ページ上部の大きな赤い「Download」ボタンをクリックして、「Downloads」というページに移動します。
その上部にある「RubyInstallers」という見出しのついた欄に「Ruby 1.9.2-p290」という項目がありますので、それをクリックするとダウンロードできます。

上記、情報掲載が遅れました事をお詫び申し上げます。

誤記のお詫び(Railsのインストールコマンド)

本書の補足説明の前に、ひとつ重大な誤記がありましたので、お詫びして訂正させていただきます。
本書82ページ、実行例3-7です。
gem install Rails

とありますが、これは、以下のように、小文字が正しいコマンド表記です。

gem install rails

次のページの図3-7に、正しいコマンドの実行の様子を掲載してあります。そちらの通りに実行してください。
大変申し訳ありませんでした。

本書の補足説明

「rake db:migrate」のトラブル
やっぱりRails3.0.0を使いたい人は
常に「移動先」でコマンドプロンプトウィンドウを開くには
常に「移動先」でターミナルを開くには(上記のMac版)
常に「移動先」でコンソールほかを開くには(上記のLinux版)
第9章で「NoMethodError」が出てファイルがアップロードできない!
上記エラーで「空のまま送信」を防ぐには

「rake db:migrate」のトラブル

2011年10月時点の「Rails3.1.0」では、データベース操作のコマンドがそのままでは実行できない問題が報告されています。 本書第4-3節、122ページの実行例4-8です。以下のコマンドです。
rake db:migrate
これを行いますと、以下のようなエラーメッセージが出ると思います(エラーなく作成されれば全く問題ありません)
rake aborted!
uninitialized constant Rake::DSL
(以下、長々とエラー箇所の説明)
この問題はいずれRailsのアップデートにより解決すると期待されますが、とりあえずの回避法がいくつか、随所で紹介されています。筆者が実践して成功した回避例は以下の通りです。
Windowsのフォルダウィンドウで、作成した「rails_app/myshop」フォルダを見てください。これは3-6節、94ページの図3-14を見る作業に相当します。

このフォルダの中に「Rakefile」というファイルがあります。アイコンは、真っ白のはずです。それを、テキスト・エディタで開いてください。

ファイルの最初のほうは、行頭が「#」になっています。以下の記述が、アプリケーションの動作に関係する記述の始まりです。
require File.expand_path('../config/application', __FILE__)
この前に、以下の記述を書き加えてください。よくわかるように、行間を開けてもかまいません(dslのlは、小文字のエルです。)。
require 'rake/dsl_definition'

ファイル「Rakefile」を保存したら、実行例4-8の「rake db:migrate」をもう一度実行してみてください。以下のような「警告」が発生しますが、結局データベースが作成され、アプリの操作を続けることができます。
C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:10: warning: already initialized constant RUBY
C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.9.2/lib/rake/file_utils.rb:84: warning: already initialized constant LN_SUPPORTED



やっぱりRails3.0.0を使いたい人は

やっぱり本書の通りにRails3.0.0が使えないと不安だ、という人は、Railsをインストールするコマンド(詳しくは本書第3章をご覧ください)に、以下のように「バージョン番号」の指定をつけてやればいいのです。
gem install rails -v 3.0.0
ただし、これはRailsやそれが必要とするRubyライブラリの提供元が、ちゃんと自分の「レポジトリ」にそれら古いバージョンを置いておいてくれるかどうかに頼っています。「そんなファイルはありません」というエラーメッセージが出るようなら、あきらめるしかありません。
まあ、よほど大きなバグを含む物を出してしまったとか、よほどたくさんのバージョンがあって管理しきれないとかいう事情でもなければ、一度レポジトリに置いたファイルを撤去するということは非常に稀ですから、心配することはあまりありません。

常に「移動先」でコマンドプロンプトウィンドウを開くには

Ruby on Railsは、「rails_appフォルダ内にあるmyshopフォルダ」のような場所で作業します。そのためには、たとえば以下のようにコマンドを打つ必要がありますね。
cd rails_app/myshop

上記は、「ホームフォルダ」からの相対パスです。なぜなら、Windowsのコマンド・プロンプトや、本書で利用した「Start Command Prompt with Ruby」は、ホームフォルダに移動した状態で開くからです。そこで、「cd」コマンドの長さを最小限に押さえるために、Railsアプリケーションの作業フォルダはホームフォルダ中のなるべく短いパスに置くほうがいいわけです。
でも、作業フォルダを他のドライブに置きたいとか、そもそも上記のコマンドさえ打ちたくない、という人もいるのではないでしょうか。
それには、コマンド・プロンプトのショートカットを、作業フォルダの中に直接置けばいいのです。そして、そのショートカットのプロパティを変更して、「作業フォルダ」の指定を書き換えます。
この方法は、本書の姉妹(姉)版「はじめてのRuby on Rails2」で紹介していますが、それはWindowsのアクセサリとして置いてある「コマンド・プロンプト」のショートカットについての話です。「RubyInstaller for Windows」についてくる「Start Command Prompt With Ruby」の場合についても同じことができます。ここで御紹介しましょう。

(1)「スタートメニュー」で、「Start Command Prompt with Ruby」のアイコンを探し、右クリックで「コピー」します。
図1 スタートメニュー上のアイコンを右クリック

(2)たとえば「C:¥Users¥noniko¥rails_app¥myshop」のフォルダウィンドウ内に貼付けます。図1のアイコンはショートカットですが、ショートカットをコピー貼付けしたものはやっぱりショートカットです。
図2 作業したいフォルダ上に貼り付け

(3)貼付けたショートカットの「プロパティ」を見てみましょう。
すると、「リンク先」の欄が選択状態になっています。このままではいけません。編集するのはその下の欄「作業フォルダ」です。
「リンク先」を間違って書き換えてしまうと、「Command Prompt with Ruby」が開かなくなりますので、気をつけましょう。
その下の欄「作業フォルダ」の中身を選択したら、安全になった「リンク先」の中身をちょっと見てみましょう。なにやら難しいものが書いてありますね。
図3 ショートカットの「リンク先」(見るだけ)

図3は、以下のように書いてあるのです。
C:\Windows\System32\cmd.exe /E:ON /K C:\Ruby187\bin\setrbvars.bat

実は図2のショートカット、ということは図1にあるコピー元もですが、その親玉は「C:\Windows\System32\cmd.exe」。これは、Windowsのアクセサリであるフツーの「コマンド・プロンプト」です。でも、そのあとに条件がついています。
詳しいことは置いといて、その条件はと言いますと、「setrbvars.bat」という名前のファイルの内容に従って環境設定をしなさい」ということです。Rubyの実行フォルダはどこにあるかというような環境の設定がそのファイルに書いてあるというわけです。

(4)なるほど納得。ということで、我々は、「作業フォルダー」の欄を編集します。その欄には初期値として「C:¥Users¥noniko」のように、ユーザのホームフォルダが入力されているでしょう。
もし、ユーザのホームフォルダのもっと深いフォルダを指定したければ、今書かれている内容のその末尾に「¥」と入れてやれば、最近のWindowsは大変お利口さんで、そのあとに続くフォルダパスの候補を出してくれます(候補に挙げてもらうためには、もちろん、作業予定のフォルダを先に作っておく必要があります)。
図4 我々が編集するのは「作業フォルダー」

図5 「¥」でパスの候補を表示

図6 作業フォルダの変更完了

(5)ショートカットの作業フォルダを変更したら、他のコマンド・プロンプトと区別できるようにしておくとよいでしょう。まず、このショートカットの名前を「command-myshop」のように変更します。そして、プロパティの「画面の色」設定で、字や背景の色をRubyらしくしておきます。
図7「画面の色」を変更

図8 myshop専用コマンドプロンプト・ウィンドウの完成


常に「移動先」でターミナルを開くには(上記のMac版)

同じようなことをMacのターミナルで行うには、ちと工夫が要ります。
(1)普通にターミナルを起動します。

(2)ターミナルの「環境設定」を開きます。

(3)最初に表示されるのはおそらく「起動」という画面だと思いますので、「設定」という画面に切り替えます。すると、ターミナルのウィンドウにはいろいろなデザインがあることがわかります。このような個々のウィンドウを「シェル」と呼ぶ、と考えてだいたいよいと思います。
図9 環境設定のタブを「設定」に切り替える

図10 実はいろいろなデザインのシェルがある


(4)ここに、我々の望む独自の設定で機能する「シェル」を新規作成します。それには、シェルの一覧の一番下にあるボタンのうち「+」をクリックします。新規作成されたシェルには、わかりやすい名前をつけます。ここでは「Rails-Myshop」としています。
図11 「+」ボタンをクリックしてシェルを追加

図12 すぐに名前を決めよう

図13 「Rails-Myshop」というシェルが作成された


(5)設定の中身としては「テキスト」が表示されていると思います。フォントを14ptくらいにしてやれば、大きくて見やすいと思います。フォントの種類にまで凝ると、字の間隔がヘンになったりしますので、種類は変えないほうが無難ですが、チャレンジ精神ある方はどうぞ。
しかし、決めなければならない最重要事項は「テキスト」ではなく「シェル」です。ボタンをクリックして切り替えます。
「シェル」の設定で「起動」の欄を見ます。「コマンドを実行」というチェックボックスにチェックを入れ、入力欄に以下のコマンドを入力してやります。
cd rails_app/myshop

図14 シェルの設定、起動時のコマンド実行

他に、字や背景などの色をカラフルにしてもいいでしょう。 Macの環境設定ウィンドウは明確に「保存」を指示しません。そのまま閉じて大丈夫です。ただし、ターミナルの場合、変更を反映させるにはターミナルというアプリケーションを一度終了して、起動し直す必要があるようです。

(6)以後、コマンドを打つときは、ターミナルを起動後メニューバーの「シェル」から「新規ウィンドウ」を選びます。シェルの一覧が表示され、今作った「Rails-Myshop」が候補に上がっているでしょう(いなければターミナルアプリケーションを終了できていません。メニューバーから「ターミナルを終了」を選んで終了させてください)。
図15 自分で作ったシェルを選ぶ

図16はRubyらしくデザインを変えたシェルです。開くと同時に、myshopフォルダまで移動しています。
図16 Macで、Rails専用シェルを開くことができた


常に「移動先」でコンソールほかを開くには(上記のLinux版)

Linuxの場合、ディストリビューションに応じて「コンソール」と呼んだり「ターミナル」と呼んだりします。
Linuxの場合、移動先でコンソールやターミナルを開くのは、とても簡単です。フォルダウィンドウ(Linuxではファイルブラウザと呼ぶことが多いです)で目的の場所を開いたら、右クリックや、ウィンドウメニューなどから、「ここでコンソールやターミナルを開く」を選択することができるのです。
図17は、openSUSEというディストリビューションのLinuxで、ファイルブラウザで「rails_app/myshop」フォルダを開いてからそこでウィンドウメニューにより「ターミナルを開く」を選んだところです。
図17 好きなフォルダを開いて「ターミナルを開く」
お使いのLinuxで、このようなメニューがない場合、ファイルブラウザ内を右クリックしてメニューを出してみてください。「端末の中に開く」という、ややヘンな日本語の項目が現れると思います。
もし、現れない場合、それは「nautilus-open-terminal」という名前のアプリケーションですから、ソフトウェア管理ツールなどを用いて、インストールしてみてください。

第9章で「NoMethodError」が出てファイルがアップロードできない!

第9章「Railsで画像を」では、Railsアプリケーション上で画像ファイルをアップロードできるようにプログラムを書きます。その最終段階で、以下のようなメッセージが出てファイルがアップロードできないということはありませんか。

NoMethodError in ItemsController#upload
undefined method 'original_filename' for ....


原因として最も可能性が高いのは、ボタンの押し間違いです。 「参照」ボタンを押すつもりで「アップロード」ボタンを押してしまうと、ファイル情報がカラっぽのまま送信されてしまい、エラーになるのです。 この場合、上記の2行目のメッセージは、以下のようになるでしょう。
undefined method 'original_filename' for nil:NilClass


たとえば「amag.png」のようなファイルをちゃんと選んだのに、やはりエラーになる場合。可能性が高いのは、upload.html.erbで、以下のコードを書き忘れたことです。
<%= form_tag 'upload_done', :multipart =>true do %>

この場合、エラーメッセージは以下のようになるでしょう。
undefined method 'original_filename' for amag.png:String

ファイル選択画面で選んだファイル名がそのまま「文字」として送信されてしまうので、「ファイル情報」に対して処理を行おうとして失敗するというエラーです。
上記エラーで「空のまま送信」を防ぐには
上記の問題で、「upload.html.erb」の書き方が悪かった場合は、それを直せばエラーはもう起こりません。しかし、「間違って参照ボタンではなくアップロードボタンを押してしまう」エラーは何度でも起こり得ます。
本書では、なるべく簡単な書き方でRailsを学ぶために、間違った操作でエラーを起こさないようにする措置は一切とっていません。「ちゃんと参照ボタンでファイルを選んでからアップロードする」ことを前提としています。
ちゃんとした操作で正しい応答が得られたら、間違った操作によるエラーを防ぐ方法を考えてみましょう。ここで言う「エラーを防ぐ」とは、みっともない英語のエラーメッセージが表示されて、操作を続けられなくなるのを防ぐことです。とすると、最低限の解決法は、再び入力欄(Uploadページ)が表示されることではないでしょうか。
それなら、「itemscontroller.rb」に定義したアクション「upload_done」の内容に、以下のように追記をすればすみます。

まず、パラメータを受け取るところまでは同じです。
 upload = params[:upload]

このパラメータの中身が空だったら困るわけです。まず、「空でないときにだけ、その後の作業をする」ようにします。
if(upload)
  @filename=Item.save_pict(upload)

「空でなくない」ときには、「Upload」ページに強制移動します。
 else
  redirect_to(upload_url)
 

最後はendで締めます。よって、修正アクションupload_doneの全文は以下のようになります。
def upload_done
 upload = params[:upload]
 if(upload)
  @filename=Item.save_pict(upload)
 else
  redirect_to(upload_url)
 end
end


これで、ファイルを選択せずに「アップロード」ボタンをクリックしても、「何も起こらない」ようにユーザには、見えます。