Railsアプリケーションを作成する

サンプルのRailsアプリケーションを作成して動作確認までを行う。

Railsアプリケーションの作成

利用するDBを--databaseオプションで指定する。
以前はデフォルトでMySQLが指定されたが、Rails2.0.2からsqlite3がデフォルトになった。


$ rails my_app --database=mysql

データベースの作成


$ cd my_app/db
$ vi create_database.sql
以下を記述

DROP DATABASE IF EXISTS my_app_development;
CREATE DATABASE my_app_development DEFAULT CHARACTER SET utf8;

DROP DATABASE IF EXISTS my_app_test;
CREATE DATABASE my_app_test DEFAULT CHARACTER SET utf8;

DROP DATABASE IF EXISTS my_app_production;
CREATE DATABASE my_app_production DEFAULT CHARACTER SET utf8;

$ mysql -u root -p
mysql> source create_database.sql

MySQLユーザの作成

アプリケーション用のMySQLユーザを作成する。


$ mysql -u root -p
mysql> GRANT ALL ON 'my\_app\_%'.* TO my_app@localhost IDENTIFIED BY '****';
ERROR 1064 (42000): You have an error in your SQL syntax...
公式リファレンス見る限りこれで良さそうだけど何故かエラーになる。
以下の方法で作成することにする。

mysql> GRANT ALL ON my_app_development.* TO my_app@localhost IDENTIFIED BY '****';
mysql> GRANT ALL ON my_app_test.* TO my_app@localhost;
mysql> GRANT ALL ON my_app_production.* TO my_app@localhost;

database.ymlの修正


$ vi my_app/config/database.yml
以下を修正

development:
adapter: mysql
encoding: utf8
database: my_app_development
pool: 5
username: my_app
password: ****
socket: /tmp/mysql.sock

test:
adapter: mysql
encoding: utf8
database: my_app_test
pool: 5
username: my_app
password: ****
socket: /tmp/mysql.sock

production:
adapter: mysql
encoding: utf8
database: my_app_production
pool: 5
username: my_app
password: ****
socket: /tmp/mysql.sock

scaffoldジェネレータの実行


$ cd my_app
$ ruby script/generate scaffold book title:string author:string price:integer
/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb:259:in 'require_frameworks': no such file to load --openssl (RuntimeError)
opensslが無いというエラーが出た。
調べてみると、Railsを使う場合はRubyのインストール前にopensslとopenssl-develを入れておく必要があるとのこと。

# rpm -qa | grep -i openssl
openssl-0.9.8e-7.el5
# yum install openssl-devel
ついでにreadlineとreadline-develも入れておく。これが無いとscript/consoleが動かないらしい。(参考 http://d.hatena.ne.jp/yatmsu/20081120/1227162444)

# yum install readline
# yum install readline-devel
RPMパッケージをアンインストールして入れなおす。

# rpm -e rubygems-1.3.1-1
# rpm -e ruby-1.8.7-1
# rm -rf /usr/lib/ruby
# rm -rf /usr/src/redhat/RPMS/i386/ruby-1.8.7-1.i386.rpm
# rm -rf /usr/src/redhat/RPMS/i386/rubygems-1.3.1-1.i386.rpm
# cd ruby-1.8.7
# make clean
# ./configure --prefix=/usr
ここから先はhttp://d.hatena.ne.jp/totemn/20090217/1237027081と同じ手順でやり直す
再びscaffoldジェネレータを実行する。

$ cd my_app
$ ruby script/generate scaffold book title:string author:string price:integer
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/books
exists app/views/layouts/
exists test/functional/
exists test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/books/index.html.erb
create app/views/books/show.html.erb
create app/views/books/new.html.erb
create app/views/books/edit.html.erb
create app/views/layouts/books.html.erb
create public/stylesheets/scaffold.css
create app/controllers/books_controller.rb
create test/functional/books_controller_test.rb
create app/helpers/books_helper.rb
create test/unit/helpers/books_helper_test.rb
route map.resources :books
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/book.rb
create test/unit/book_test.rb
create test/fixtures/books.yml
create db/migrate
create db/migrate/20090410220451_create_books.rb

テーブルの作成

scaffoldジェネレータによって作られたマイグレーションファイルを実行することでテーブルを作成する。


$ rake db:migrate
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
no such file to load -- mysql
mysqlドライバが無いというエラーが出たのでドライバを入れる。

$ gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
再びmigrateを実行する。

$ rake db:migrate
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
rake aborted!
libmysqlclient.so.15: cannot open shared object file: No such file or directory - /usr/lib/ruby/gems/1.8/gems/mysql-2.7/lib/mysql.so
今度はlibmysqlclient.so.15が見つからないというエラー。
libmysqlclient.so.15のパスをld.so.cacheに追加する。

$ vi /etc/ld.so.conf.d/mysql.conf
以下を記述して保存する。

/usr/local/mysql/lib

$ ldconfig

migrateを実行する。

$ rake db:migrate
== CreateBooks: migrating ====================================================
--create_table(:books)
-> 0.0048s
== CreateBooks: migrated (0.0050s) ===========================================
作成されたテーブルを確認してみる。

$ mysql -u my_app -p
mysql> use my_app_development
mysql> desc books;

Field | Type | Null | Key | Default | Extra
id | int(11) | NO | PRI | NULL | auto_increment
title | varchar(255) | YES | | NULL |
author | varchar(255) | YES | | NULL |
price | int(11) | YES | | NULL |
created_at | datetime | YES | | NULL |
updated_at | datetime | YES | | NULL |
6 rows in set (0.00 sec)

動作確認

WEBrickを起動する。


$ cd my_app
$ ruby script/server
http://localhost:3000/booksにアクセスするとbook一覧ページが表示された。