いよいよ...webアプリケーションを作ってみる!

ようやく、データベースを使ったwebアプリケーション作成の準備が整った。で、何を作ろうか...。検索してみると、みんないろんなものを作っている。ToDoリスト、日記、ブログ、アドレス帳、料理レシピ集、フォトアルバム、お店ガイド、...等々。呼び方はいろいろだけど、出来上がりのwebアプリケーションの骨格はみな同じだ。webブラウザを通してデータベースにアクセスして、データの追加、削除、表示が出来るようになっている。
これってmysqlコマンドで、データベースにアクセスするのと似ている。あとは見せ方の問題なのか...。タイトルと写真があればフォトアルバム、やるべきことがタイトルになっていればToDoリスト、今日の出来事なんてタイトルなら日記になるのか...。
それでは何を作るかではなく、どんなタイトルを付けるかを決めれば良いのだ。しばし考え「ソフトウェアブック」に決定。パソコンにインストールしているソフトウェアの「名称」「説明」「ダウンロード先」などを管理するリスト。はじめの一歩としては丁度いい規模かも。

Ruby on Railsプロジェクトの開始

  • ターミナルで、railsappフォルダに移動して、softwarebookプロジェクトを作成する。コマンドは「rails softwarebook」と単純で分かり易い!
MacBook:~ zari$ cd ~/railsapp
MacBook:~/railsapp zari$ rails softwarebook
  • softwarebookフォルダが作成され、フォルダとファイルがズラズラと作成された。こちらは複雑で分かりにくい...。
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  components
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/mocks/development
      create  test/mocks/test
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  public/.htaccess
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/breakpointer
      create  script/console
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/process/reaper
      create  script/process/spawner
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log


データベースの設定ファイルを登録した

  • RailsからMySQLに接続するための設定は、「~/railsapp/softwarebook/config/database.yml」ファイルに保存するそうだ。テキストエディットで開いて、データベースの設定を確認する。

      • この内容は「rails softwarebook」を実行したときに自動生成されたもの。「database: 」はプロジェクト名にアンダーバーを付けて、それぞれの環境名が続いている。ここでは、Railsが生成したものをなるべくそのまま使うように心がけた。(...というより、アレンジするほど分かってないのさ)
  • development:、test:、production: のように設定が分かれており、それぞれ開発環境、テスト環境、製品環境(本稼働環境)として個別にデータベースを登録して、それぞれの環境で稼働出来るそうだ。
  • 今回はdevelopment:(開発環境)のデータベースだけ設定して試してみる。password:の項目に「'0123'」を設定した。(MySQL 権限の初期設定で登録したrootユーザのパスワード
... 途中省略 ...
development:
  adapter: mysql
  database: softwarebook_development
  username: root
  password: '0123'
  host: localhost
... 途中省略 ...
  • ちなみにこの設定だと「mysqlを通して、softwarebook_developmentというデータベースを利用、ユーザ名:root、パスワード:0123、localhostから接続する。」という意味。

注意!!:ハマったこと

      • Railsが自動作成するdatabase.ymlファイルには、development:とtest:の項目で、「password:」直後の「スペース1文字分」が抜けている。パスワードを入力する時には、1スペース間隔を空けて入力すること。

      • パスワードを数字だけで設定した場合、先頭の数字が「0」ゼロで始まると、「password: 0123」とすると「0」を省略してMySQLとやり取りしてしまうようだ。「0123」をパスワードとして設定するのであれば、「password: '0123'」のように、シングルクォーテーションで囲む必要あり。(自分の環境だとエラーが出て接続出来なかった...。なんで数字だけの、しかも先頭が0で始まるパスワードにしちゃったんだろ...。運が悪い、けど...一つ利口になった。)

        OK ...... password: '0123'
        NG ...... password:'0123'  スペースなし
        NG ...... password: 0123   '    'がない

mysqlで接続し、データベースを新規作成した

  • ターミナルから、rootユーザでMySQLに接続(太字の部分を入力した)
MacBook:~ zari$ mysql -u root -p
Enter password: 
  • データベースの新規作成(太字の部分を入力した)
mysql> create database softwarebook_development;
Query OK, 1 row affected (0.00 sec)
  • 今作ったデータベースを確認してみる。
mysql> show databases;
                                                      • +
Database
                                                      • +
information_schema
mysql
softwarebook_development
test
                                                      • +
4 rows in set (0.00 sec)
  • mysqlでの接続作業はここまで。

Railsのモデルを作成した。

  • ここで言うモデルとは、データベースのテーブルの中の1レコード分を表現するものだと、自分なりに解釈した。
  • モデル名は「software」とし、以下の要素を保持することにした。
    • ソフトウェア名:title
    • 概要説明:description
    • ダウンロード先アドレス:url
MacBook:~ zari$ cd ~/railsapp/softwarebook
MacBook:~/railsapp/softwarebook zari$ script/generate model software
  • ディレクトリを~/railsapp/softwarebookに移動して、太字のコマンドを入力すると、またまたフォルダとファイルが生成された。
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/software.rb
      create  test/unit/software_test.rb
      create  test/fixtures/softwares.yml
      create  db/migrate
      create  db/migrate/001_create_softwares.rb

データベースにテーブルとフィールドを登録

  • Railsのモデルの設計にあわせて、MySQLのテーブルとフィールドを設定した。設定はRailsマイグレーションという機能から行った。
  • マイグレーションとは、開発過程でのデータベースの変更履歴を管理するような仕組みらしい。
  • マイグレーションの設定ファイルは「~/railsapp/softwarebook/db/migrate/001_create_softwares.rb」で行う。
    • さっきモデルを作成した時に自動的に生成されたのだ。
    • データベースの変更があるたびに 002_*.rb、003_*.rb、...のように先頭にバージョン番号が付加されたファイルが増えていくらしい。


  • テキストエディットで開き、コメント行# t.column :name, :stringを参考にして、title、description、urlというフィールドを作成する行を追加した。(太字の部分を追加した)
class CreateSoftwares < ActiveRecord::Migration
  def self.up
    create_table :softwares do |t|
      # t.column :name, :string
      t.column :title, :string
      t.column :description, :text
      t.column :url, :string
    end
  end

  def self.down
    drop_table :softwares
  end
end
  • 保存したら、ターミナルから以下のコマンドを実行した。(太字の部分を入力した)
 MacBook:~/railsapp/softwarebook zari$ rake migrate
 (in /Users/zari/railsapp/softwarebook)
 == CreateSoftwares: migrating =================================================
 -- create_table(:softwares)
    -> 0.0332s
 == CreateSoftwares: migrated (0.0334s) ========================================
  • 無事、テーブルとフィールドが作成されたようだ。
      • マイグレーションを利用すると、Railsの決めごとをあまり意識しなくても良いところが好き。例えば、テーブル名は複数形にするとか、「id」というキーになるフィールドを設定しなければならないとか。
      • また、プログラムとしてデータベースを作成する過程が残るので、何をやったかを把握し易い。全てを作り直す時もコマンド一つで済むところが好き。(うまく行かなくて、試行錯誤で何回やり直したことか...。)

scaffoldでアプリケーションの基盤が完成!

  • あとは、次のコマンドで全てが片付いた。この1行にRuby on Railsの魅力が凝縮されているらしい...。
MacBook:~/railsapp/softwarebook zari$ script/generate scaffold software
  • 相変わらズラズラと、フォルダとファイルが...。
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/softwares
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/software.rb
   identical    test/unit/software_test.rb
   identical    test/fixtures/softwares.yml
      create  app/views/softwares/_form.rhtml
      create  app/views/softwares/list.rhtml
      create  app/views/softwares/show.rhtml
      create  app/views/softwares/new.rhtml
      create  app/views/softwares/edit.rhtml
      create  app/controllers/softwares_controller.rb
      create  test/functional/softwares_controller_test.rb
      create  app/helpers/softwares_helper.rb
      create  app/views/layouts/softwares.rhtml
      create  public/stylesheets/scaffold.css

アプリケーションの確認

  • Railsの開発用サーバーを起動すると、下記のような表示が出てスタートする。
MacBook:~/railsapp/softwarebook zari$ script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-10-22 14:04:12] INFO  WEBrick 1.3.1
[2006-10-22 14:04:12] INFO  ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
[2006-10-22 14:04:12] INFO  WEBrick::HTTPServer#start: pid=950 port=3000


  • 英語表示で見た目の工夫もないが、データの新規作成、一覧表示、個別表示、修正、削除が出来るようになっていた。基本機能が実現されているので、あとは表示方法のカスタマイズをしていくことで洗練させていけば良いとのこと。


世界一時間のかかったRuby on Railsでの開発...。

ここまで長かった...。web上では「10分で作る」とか「15分で作る」...などというページが多数あるが、なんと!!1週間近くもかかってしまった...。(これは自分自身のスキルの問題で、決してRuby on Railsの効率が悪い訳ではない!)おそらく世界一時間のかかったRuby on Rails開発でしょう。(しかも完成しているのは、まだ基盤だけ)開発の早さを謳うページは数えきれないほどあるのだから、たまにはこんなページがあっても良いかもしれない!?。
ここまでやってみて感じたことは、とりあえずでも、こんなふうに動いてしまうとは素晴らしいことだ!一度動いてしまうと、あとは試行錯誤で少しずつ前進して行ける気になる。スクリプト言語というのはコンパイルとか、ビルドとか、そんなワンクッションがなく修正したらすぐ反映するところが手軽で良いかな。
きっと、今なら出来るさ...。10分、15分というのは無理かもしれないけど、30分くらいあれば...。scaffoldくらいまでならね。