スクラッチでRails3に挑戦 Part 1(MySQL DBのテーブルの内容を表示させるまで)

Rails3のデフォルトのDBであるSQLiteを使用して,ジェネレータでschaffoldを利用すれば,あっという間にテーブルのCRUD処理ができてしまいますが,ここではもっとシンプルに,MySQLデータベースの簡単なテーブルの内容を表示するだけのモノを作ってみたいと思います.

まずは,MySQLで簡単なテーブルを用意してみます.

$ mysql5 -u root -p

※portで入れたMySQLのVersionは5.Xで,デフォルトでMySQLのクライアントプログラムの名前(ファイル名)が,「mysql」ではなく「mysql5」になっている.

まずは,データベースを作成します.名前は次のとおりにしておくと,作業がスムーズになります.

  • ○○○○○○_development
  • ○○○○○○_test
  • ○○○○○○_production

とりあえず,development用を作成します.

mysql> CREATE DATABASE sample_development;

このデータベースにアクセスできるデータベースユーザを作成します.ユーザ名は「hoge」で,パスワードは「foobar」とします.

mysql> GRANT ALL ON sample_development.* TO hoge@localhost IDENTIFIED BY 'foobar';

それでは一旦,QUITして,hogeユーザでMySQLに接続してみます.

mysql> ¥q
$ mysql5 -u hoge -p

データベース「sample_development」に切り換えて,簡単なテーブル「students」を作成してみます.ここで,テーブル名を複数形で設定するのがRails流です.

mysql> use sample_development
Database changed

mysql> CREATE TABLE students (
-> id CHAR(11) NOT NULL PRIMARY KEY,
-> name VARCHAR(20),
-> email VARCHAR(100));
Query OK, 0 rows affected (0.40 sec)

mysql> DESC students;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | char(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| email | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

テーブルのフィールドは適当で良いと思いますが,一応,フィールド「id」を主キーで設定しておきます.INT型でなくてもいいのかな?
ついでに,1〜2個レコードを追加しておきましょう.

mysql> INSERT INTO students VALUES ('1234567890', 'Taro KAGOSHIMA', 'taro@kago.jp');
Query OK, 1 row affected (0.33 sec)

mysql> INSERT INTO students VALUES ('1234567891', '薩摩花子', 'hana@kago.jp');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM students;
+------------+----------------+--------------+
| id         | name           | email        |
+------------+----------------+--------------+
| 1234567890 | Taro KAGOSHIMA | taro@kago.jp |
| 1234567891 | 薩摩花子        | hana@kago.jp |
+------------+----------------+--------------+
2 rows in set (0.00 sec)

この辺は,もうデータベースの使い方の説明ですね...

さて,やっとRailsの方に入ります.既に,Rails3が設定してあるものとします.

$ rails new sample -T -d mysql

アプリケーション名は「Sample」とします.「Test」は使用しないので(というか使うとしてもRSpecを使用するので)「-T」オプションを付けて,さらにDBMSとしてMySQLを使用するので,「-d mysql」しておきます.

カレントディレクトリを移動して,後々使うであろうRSpecのために,Gemfileをいじります.

$ cd sample
$ vi Gemfile

[Gemfileの内容]

:
group :development do
    gem 'rspec-rails', '~> 2.7.0'
end

group :test do
    gem 'rspec-rails', '~> 2.7.0'
    gem 'webrat', '~> 0.7.0'
end

Gemfileを更新したら忘れずに...

$ bundle install

続いて,MySQLデータベースに接続するための情報を「config/database.yml」に書いておきます.記載するのはusernameとpasswordで,後は既に記載されていると思います.

[config/database.ymlの内容]

:
development:
    encoding: utf8 adapter: mysql2
    reconnect: false
    database: sample_development
    pool: 5
    username: hoge
    password: foobar
    socket: /opt/local/var/run/mysql5/mysqld.sock
:

rakeコマンドを実行(既にテーブルは作成しているし,実行する必要あるかな〜)※補足(2011/11/11)既にテーブルは作成されていますので,このコマンドは実行しなくてもいいです.モデルを作成すればそれでO/Rマッピングしてくれます.

$ rake db:migrate

ついでに,この時点でRSpecをインストールしておきます.

$ rails g rspec:install
  create .rspec
  create spec
    create spec/spec_helper.rb

MVC(Model View Controller)アーキテクチャの一つであるモデルを作成します.
モデル名は「Student」とします.※単数形で指定します.

$ rails g model Student
  invoke active_record
    create db/migrate/20111105044958_create_students.rb
    create app/models/student.rb
  invoke rspec
    create spec/models/student_spec.rb

すると,こんな感じでモデルクラス「Student」が定義されます.

class Student < ActiveRecord::Base
end

ここには,後々別のモデル(テーブル)との関連性(has_many,belongs_toなど)を記述したり,フィールドデータの妥当性(validates)を記述したりする予定です...

続いて,MVCアーキテクチャの一つであるコントローラを作成します.
コントローラ名は「Students(StudentsController)」とします.※複数形で指定します.
併せて,アクションとして「index」メソッドも設定してしまいます.

$ rails g controller Students index
  create app/controllers/students_controller.rb
    route get "students/index"
  invoke erb
    create app/views/students
    create app/views/students/index.html.erb
     :

ここで,ルーティング情報を設定します.
クライアントからのRESTfulな要求(即ち,HTTPメソッドとURLとの組合せによるサーバへの要求)に対して,適切なコントローラ・アクション(例えば,Studentsのindexメソッドなど)にマッピングさせるために,次のように「config/routes」に1行加えます.
[config/routes.rb]

Sample::Application.routes.draw do
  resources :students
  :
end

「resource :コントローラ」と記載するだけで,CRUD操作(テーブルに対するレコードの新規登録,更新,検索,削除の操作)に関するルーティング設定を行ってくれます.実際に現在のルーティング情報を見てみると...

$ rake routes
students_index GET    /students/index(.:format)    {:controller=>"students", :action=>"index"}
students       GET    /students(.:format)          {:action=>"index", :controller=>"students"}
               POST   /students(.:format)          {:action=>"create", :controller=>"students"}
new_student    GET    /students/new(.:format)      {:action=>"new", :controller=>"students"}
edit_student   GET    /students/:id/edit(.:format) {:action=>"edit", :controller=>"students"}
student        GET    /students/:id(.:format)      {:action=>"show", :controller=>"students"}
               PUT    /students/:id(.:format)      {:action=>"update", :controller=>"students"}
               DELETE /students/:id(.:format)      {:action=>"destroy", :controller=>"students"}

上述してあるとおり,GETメソッドによる「http://localhost:3000/students/index」あるいは「http://localhost:3000/students」という要求があったとき,「students」コントローラの「index」アクションを見に行くよう指定されています.他にも「new」,「edit」,「update」,「destroy」,「create」などもありますが,まだこれは未設定です.

というか,まだ「index」アクションも実装していませんので,次のようにきちんと実装させます.とりあえず,studentsテーブルの全レコードを表示させたいので,インスタンスフィールド@studentsに,全てのレコード結果を代入させます.

[app/controllers/students_controller.rb]

class StudentsController < ApplicationController
  def index
    @students = Student.all
  end
end

コントローラのindexアクションは,MVCアーキテクチャの一つであるビューを使って結果を表示させます.「index」アクションの場合は,「index.html.erb」となります.
単純に,tableタグでレコードを表示させるようにしてみます.

[app/views/students/index.html.erb]

<h1>All Students</h1>
<table>
  <thead>
    <tr>
      <th>id</th>
      <th>name</th>
      <th>email</th>
    </tr>
</thead>
<tbody>
  <% @students.each do |student| %>
    <tr>
      <td><%= student.id %></td>
      <td><%= student.name %></td>
      <td><%= student.email %></td>
    </tr>
  <% end %>
</tbody>
</table>

ノーマルなtableタグスタイルではちょっと乏しいので,CSSを書いてやります.記載するCSSスタイルファイルは「app/assets/stylesheets/application.css」になります.

[app/assets/stylesheets/application.css]

table {
  border: 1px solid #999;
  border-spacing: 0;
}

td, th {
  border: 1px solid #999;
  padding: 0.3em 0.9em;
}

th {
  background-color: #aee;
}

これで,RailsのWebサーバを立ち上げて...

$ rails s

Webブラウザで次のアドレスを指定すると...

http://localhost:3000/students

students(学生)テーブルのレコード一覧が表示されます.ちゃんちゃん.

index view

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中