minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

まずはWebサーバを起動するところまで成功した。

データベースとの連携

が、まだデータベースと連携していない。
Railsを使うには、データベースが必要だ。
デフォルトでは sqlite3 なのだが、やはりここはMySQLでいきたい。
というわけでrubyからMySQLを使えるようにする。

% gem install mysql -- --with-mysql-dir=/opt/mysql/mysql-standard-5.0.27-linux-i686-glibc23

MySQLのパスは適宜変更する。
予めMySQLはインストールしておくこと。
そしたら、MySQL用のプロジェクトを作成してみる。

% rails /mnt/var/prog/rails/sample2 -d mysql
% cd /mnt/var/prog/rails/sample2

まずはDBの設定を行う。

config/database.yml
  development:
    adapter: mysql
    encoding: utf8
    database: rails_development
    pool: 5
    username: root
    password:
    socket: /tmp/mysql.sock

ここからがrailsの本領発揮。データベースの作成などは全て自動で行う。

% rake db:create

この段階ではまだrails_developmentスキーマが作成されただけ。

generate

続いて以下を実行。

% script/generate controller home index 
    exists  app/controllers/
    exists  app/helpers/
    create  app/views/home
    exists  test/functional/
    create  app/controllers/home_controller.rb
    create  test/functional/home_controller_test.rb
    create  app/helpers/home_helper.rb
    create  app/views/home/index.html.erb

色々作成された。index.html.erb っていうのがおそらくメインページだろう。
erb はJSPみたいにhtml中にRubyスクリプトを埋め込めるもの。

% script/server

見た目は特にさっきと何も変わらない。

http://localhost:3000/home/index

これで、indexページにアクセスできる。

home_1.png

…実にしょぼい(笑)。
それもそのはず。index.html.erb を見てみよう。

app/views/home/index.html.erb
  <h1>Home#index</h1>
  <p>Find me in app/views/home/index.html.erb</p>

route

トップページを別のものに変えてみよう。
まずは、現在使っているトップページのファイルをrenameしておく。

% mv public/index.html public/index.html.org

そして http://localhost:3000/ にアクセスしてみる。

error_route.png

こんなエラーが出た。
要するに、/ に対応するファイルが見つからないということだ。
Rails ではこのマッピングを内部DSLを使って解決する。
DSL とは、Domain Specific Language の略。日本語訳すれば、ドメイン特化言語。

config/routes.rb
  ActionController::Routing::Routes.draw do |map|
    map.connect ':controller/:action/:id'
    map.connect ':controller/:action/:id.:format'
  end

多くのフレームワークがXMLで設定を構築するのに対し
Rails ではこのようにRubyスクリプトで構築する。
これは Rails の大きな利点だと思っている。
XMLはあまりに 構文ノイズ が多く、人が読むのには適していない。
内部DSLではRubyのスクリプトがそのまま使える。

外部DSL

ちなみに先ほど紹介した database.yml は、外部DSLを採用している。
これはRubyスクリプトではなく独自の言語による実装。
どちらも一長一短があるが、外部DSLの良い所は言語仕様に捉われず
可能な限りカスタマイズが出来る点にある。そしてRuby以外の言語でも
パーサさえ用意すれば同じフォーマットのファイルを使える。

さて、少し話が脱線したが。
先程アクセスした http://localhost:3000/home/index はどのようにマッピングされているだろうか。
controller = home, action = index となる。
/posts/edit/1 の場合は、controller = posts, action = edit, id = 1 となる。

map.root

routes.rb に、以下の一文を追加する。

map.root :controller => "home" 

これは、contoller のデフォルト値を home にするという意味。
つまり、

http://localhost:3000/
http://localhost:3000/home/

が同じマッピングとなる。
さらに、homeコントローラはデフォルトのアクションが index なので
以下と同じになる。

http://localhost:3000/home/index

これで、http://localhost:3000/ にアクセスすれば home/index.html.erb が表示されるようになる。

マッピングを変更しただけでは、Webサーバの再起動は必要ない。
ちなみにこの動作は development mode 特有のもので、デフォルトではこのモードになっている。
おそらく production mode のようなものがあるのだろう。