2011年4月13日水曜日

Ruby on Railsへの再挑戦

ここのところJavaScriptでGoogle Mapをいじってみたり、Ajaxの基礎を学習していたのだけど、XMLHTTPrequestを学ぶに当たってサーバ側もやらなくてはなあと感じてRailsに戻ってみることに。
とりあえず初っ端からつまずいたので、備忘にログを残しておく。

■問題の発生箇所
//railsのインストール後、serverが起動できない。
user@user-PC:~/development/gitwork/depot$ rails server
Could not find gem 'mysql2 (>= 0, runtime)' in any of the gem sources listed in your Gemfile.

エラーメッセージを元にWebを検索するも、いまひとつどこが問題かはっきりしない。
その後半ば勘だよりで"libmysqlclient16-dev"のインストールを行ったところ、bundle installコマンドが無事に通った。

■以下、ログ
user@user-PC:~/development/gitwork/depot$ sudo apt-get install libmysqlclient16-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
libmysqlclient-dev
以下のパッケージが新たにインストールされます:
libmysqlclient-dev libmysqlclient16-dev
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
3,166kB のアーカイブを取得する必要があります。
この操作後に追加で 8,380kB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://jp.archive.ubuntu.com/ubuntu/ maverick-updates/main libmysqlclient-dev i386 5.1.49-1ubuntu8.1 [3,106kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ maverick-updates/main libmysqlclient16-dev all 5.1.49-1ubuntu8.1 [60.6kB]
3,166kB を 1秒 で取得しました (2,531kB/s)
未選択パッケージ libmysqlclient-dev を選択しています。
(データベースを読み込んでいます ... 現在 166455 個のファイルとディレクトリがインストールされています。)
(.../libmysqlclient-dev_5.1.49-1ubuntu8.1_i386.deb から) libmysqlclient-dev を展開しています...
未選択パッケージ libmysqlclient16-dev を選択しています。
(.../libmysqlclient16-dev_5.1.49-1ubuntu8.1_all.deb から) libmysqlclient16-dev を展開しています...
man-db のトリガを処理しています ...
libmysqlclient-dev (5.1.49-1ubuntu8.1) を設定しています ...
libmysqlclient16-dev (5.1.49-1ubuntu8.1) を設定しています ...
user@user-PC:~/development/gitwork/depot$
user@user-PC:~/development/gitwork/depot$
user@user-PC:~/development/gitwork/depot$ sudo bundle install
Fetching source index for http://rubygems.org/
Using rake (0.8.7)
Using abstract (1.0.0)
Using activesupport (3.0.6)
Using builder (2.1.2)
Using i18n (0.5.0)
Using activemodel (3.0.6)
Using erubis (2.6.6)
Using rack (1.2.2)
Using rack-mount (0.6.14)
Using rack-test (0.5.7)
Using tzinfo (0.3.26)
Using actionpack (3.0.6)
Using mime-types (1.16)
Using polyglot (0.3.1)
Using treetop (1.4.9)
Using mail (2.2.15)
Using actionmailer (3.0.6)
Using arel (2.0.9)
Using activerecord (3.0.6)
Using activeresource (3.0.6)
Using bundler (1.0.12)
Installing mysql2 (0.2.7) with native extensions
Using thor (0.14.6)
Using railties (3.0.6)
Using rails (3.0.6)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
user@user-PC:~/development/gitwork/depot$

そうしたらrails serverが機能。とりあえず良かった。
続いて立ち上げたローカルサーバにアクセスし、ページを表示させる。
About your application's environmentをクリックすると、今度はMysql2のエラー。アクセスが拒否されたらしい。
database.ymlファイルの設定に問題があるようなので、調整。
確かにpasswordが設定されていない、が、根本的な問題はアクセス先に指定されているデータベースがmysql上に存在していないことにあるっぽい。
mysqlクライアントからデータベースを作成後、再度アクセス。

今度は別のエラー。
ArgumentError (syntax error on line 15, col 2: ` socket: /var/run/mysqld/mysqld.sock')

調べる前に記録をとっていたが、再度アクセスしたら難なく動作した。とりあえず良とする。
その後、rakeコマンドでエラーが多発。そのうち公式のHPと参考書をちゃんぽんにしてコマンドを実行していたら、mysqlへのアクセスにパスワードが不要になってしまった。
よくよく公式を読んでみると、rake db:createコマンドはdatabase.ymlファイルの記述を利用してデータベースを作成しているように見える。(rake -Tでヘルプを出したところ、間違いないことが確認できた)
最終的にdatabase.ymlからパスワードを削除してからコマンドを実行した時のログが以下のもの。

user@user-PC:~/development/gitwork/exam$ rake db:create
(in /home/hiroshi/development/gitwork/exam)
exam_test already exists
exam_development already exists

ymlファイルのpasswordのエントリが空だったから、パスワードが不要になったということか。しかしymlファイルの記述はデータベースに紐続けられているように思えるが、そもそもパスワードってデータベース単位で設定できるのかよく分かっていなかったりする。
これも調べておかないと。