WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Ruby on Rails を使ってみよう!

前回の記事でインストールした Ruby on Rails ですが、いよいよ実際に使ってみたいと思います。まずは小手調べということで、データベースを使わずに簡単な Web アプリケーションの作成に挑戦します。これにより、 Ruby on Rails の基本構造を理解することができるはずです。

それでは、皆さんご一緒に Ruby on Rails の世界を体験してみましょう!(^^)

MVC アーキテクチャについて

Ruby on Rails を触り始める前に、ひとつだけ知っておきたい概念があります。それが MVC(Model-View-Controller) アーキテクチャというものです。データ構造 (Model)、表示 (View)、制御 (Controller) のそれぞれのコードを可能な限り分離して設計するプログラミング手法で、とくに GUI アプリケーションの柔軟性・メンテナンス性を高めることができると言われています。 Web アプリケーションも広義の意味で GUI アプリケーションの一種なので、この構成を採用することは理に適っています。

もちろん Ruby on Rails もこの MVC アーキテクチャを採用しています。というより、ほぼ強制と言っていいでしょう。 Ruby on Rails の主なロジックはこの MVC アーキテクチャを前提にしていますので、それを採用しなければ Ruby on Rails のメリットがほとんど失われてしまいます。また、故意に、もしくは不注意で MVC の分離を曖昧にしてしまえば、保守性が極端に低下してしまうことでしょう。MVC アーキテクチャを維持することは、 Ruby on Rails とうまく付き合っていくポイントのひとつです。

詳しくは後述しますが、 Ruby on Rails の構成要素と MVC アーキテクチャとの関係は下表のようになっています。

Modelデータベースのテーブル(および対応する Ruby オブジェクト)
ViewERB によって Ruby コードを埋め込んだ HTML ファイル
ControllerApplicationController クラスを継承した Ruby オブジェクト

このことは Ruby on Rails でのプログラミングを理解するうえで非常に重要ですので、覚えておいてください。

アプリケーションの作成

まず最初に、アプリケーションの基本構造を作成します。と言っても、単に rails コマンドを実行するだけです。このコマンド一発で、 Ruby on Rails の基本的なディレクトリ構造と最低限必要なファイル類が作成されます。ここでは、ホームディレクトリ以下に "RoR" というディレクトリを作成し、そこにアプリケーションのファイルをすべて格納することにしましょう。実行するコマンドは以下のとおりです。

cd ~
rails RoR

これを実行すると、"~/RoR" 以下にいくつかのディレクトリとファイルが作成されます。前回の記事でも触れましたが、 Ruby on Rails は「設定よりも慣習」というポリシーで設計されており、アプリケーションに対して一定の構造(ディレクトリ構造や前述の MVC アーキテクチャなど)を強制してきます。これは多くの先達によって高いレベルで有効性が実証された構造ですので、ありのままに受け入れるのが吉です。それを否定したところで、なにも良いことはありません(^^;

さて、それではさっそく実行してみましょう。 Ruby on Rails は WEBrick による Web サーバーを内蔵していますので、以下のコマンドでそれを起動します。

cd ~/RoR
ruby script/server

RoR デフォルトページ

あとは、Web ブラウザで "http://localhost:3000/" にアクセスすれば、右図のようなページが表示されるはずです。もちろんローカルホスト以外からも接続できます。その場合はドメイン名を適切に置き換えてください。

確認できたら、Ctrl+C で Web サーバーを終了させることができます。ただし、アプリケーションの作成中は常に Web サーバーを起動しっぱなしにしておくのがお勧めです。起動時に "--deamon" オプションを付ければ、バックグラウンドで動作させることもできます。

これで Ruby on Rails が動作していることが確認できました。あとは必要なコードをどんどん追加していけばよいわけです。

ページを作成する

なにはともあれ、単純な Web ページを表示させないことには話が始まりません。そのためには、コントローラとビューを作成し、若干のコードを記述する必要があります。といっても、なにも難しいことはありませんので、気楽にやってみましょう。

コントローラの作成

まずはコントローラを作成します。必要なほとんどのコードは "script/generate" というコマンドが自動作成してくれますので、とてもお手軽です。ここでは、"First" という名前のコントローラを作成することにしましょう。以下のコマンドを実行してください。

cd ~/RoR
ruby script/generate controller First

先ほどの "rails" コマンド同様にいくつかのディレクトリ・ファイルが作成されます。ここで編集する必要があるのは、"~/RoR/app/controllers/first_controller.rb" というファイルだけです。このファイルの内容は ApplicationController クラスを継承した FirstController クラスの定義です。もっとも、現時点では単に空のクラスが定義されているだけです。そこに、page という空の public メソッドを追加します。"first_controller.rb" の内容は以下のようになります。

class FirstController < ApplicationController
  def page
  end
end

ここで少し種明かしをすると、 Ruby on Rails ではコントローラクラスの public メソッドひとつひとつが Web ページのような扱いになります(このようなメソッドを「アクション」と呼びます)。従って、上記のように記述した場合、"http://localhost:3000/first/page" という URL にアクセスしたときに "FirstController#page" メソッドが実行されるわけです。 Ruby の強力なリフレクション機能により、コントローラクラスやそのメソッドを定義しただけでダイレクトに結果に反映されます。 URL とメソッドの対応を他の場所に記述する必要はありません。「同じことを 2 箇所に書かない」というのはメンテナンス性を向上させるための基本原則ですが、それが確実に、しかもごく自然に実現されています。素晴らしいですね。

ただし、今のところは上記の URL にアクセスしてもエラーページが表示されてしまいます。ビューを定義していないために、表示内容が生成できないのです。これは次でフォローします。

ビューの作成

それでは、ビューを定義してページが表示されるようにしましょう。 Ruby on Rails でのビューは単一の ERB ファイル (.rhtml) ですので、とくに作成用のスクリプトなどは用意されていません。"app/views" 内にコントローラと同名のディレクトリが作成されていますので、そこにアクションと同名の ".rhtml" ファイルを配置すれば、自動的にビューとして使用されます(リフレクション万歳^^;)。ここではコントローラは first、アクションは page ですので、ビューのファイル名は "~/RoR/app/views/first/page.rhtml" です。 vi などのテキストエディタで以下の内容を入力・保存してください。

<html>
  <head>
    <title>First RoR Page</title>
  </head>
  <body>
    <h1>This is my first RoR page. Cool!</h1>
  </body>
</html>

This is my first RoR page. Cool!

上記のソースは ERB を機能はまったく使用していない、単なる HTML ですが、現時点ではこれでじゅうぶんです。これでビューが作成されました。必要に応じて Web サーバーを起動して "http://localhost:3000/first/page" にアクセスすると、右図のようなページが表示されるはずです。

ついにオリジナルのページが表示されました!(^^)ビューの内容を変更したり、新しいアクションを追加したりしていろいろ試してみてください。

コントローラとビューの連携

単純な HTML の表示はできましたが、このままでは Web アプリケーションとは呼べませんね。動的な要素を追加してもう少し Web アプリケーションっぽくしてみましょう。前回の記事でご紹介した「RailsによるアジャイルWebアプリケーション開発」ではここで現在時刻を表示させたりしているのですが、それを真似するのも面白くありません。簡単にできて面白いネタを、無い知恵絞って考えた結果、じゃんけんアプリを作ることにしました(笑)。ページにグー、チョキ、パーのリンクを表示し、それをクリックすると次のページで勝ち負けを表示する感じです。

作るものが決まったところで、さっそく実装してみましょう!

コントローラの拡張

さきほど作成した "first" コントローラをそのまま流用して、以下のように変更してください。

class FirstController < ApplicationController
  Hand = ["rock", "paper", "scissors"]
  def page
    judge(-1)
  end
  def rock
    judge(0)
  end
  def paper
    judge(1)
  end
  def scissors
    judge(2)
  end
 
  def judge(your_hand)
    my_hand = rand(3)
    case your_hand
    when my_hand
      @judge = "Tie game."
    when (my_hand + 1) % 3
      @judge = "You win!"
    when (my_hand + 2) % 3
      @judge = "You loose!"
    else
      @judge = nil
    end
    if @judge
      @my_hand = Hand[my_hand]
      @your_hand = Hand[your_hand]
    end
  end
  private :judge
end

前述のとおり、公開メソッドである pagerockpaperscissors はそれぞれ Web ページと 1 対 1 で対応します。実際の勝ち負け判定は下位ルーチンである judge メソッドで行っているわけですが、この judge メソッドが private になっている点に注意してください。こうしておかないと judge メソッドも Web ページとして扱われて、Web アクセスにより実行可能になってしまいます。

ビューの拡張

次はビューを変更しましょう。いよいよ ERB コードが登場します。

<html>
  <head>
    <title>The Rock-Paper-Scissors Game</title>
  </head>
  <body>
    <% unless @judge %>
      <h1>Choose your hand!</h1>
    <% else %>
      <h1><%= @judge %></h1>
      <p>
        Your hand : <%= @your_hand %><br/>
        My hand : <%= @my_hand %>
     </p>
    <% end %>
    <p>
      <%= link_to "rock", :action => "rock" %><br/>
      <%= link_to "paper", :action => "paper" %><br/>
      <%= link_to "scissors", :action => "scissors" %>
    </p>
  </body>
</html>

ここで ERB について簡単にご説明しましょう。 ERB は HTML などのテキストファイルに Ruby コードを埋め込むライブラリで、ちょうど PHP の Ruby 版のようなものです。上記のように "<% 〜 %>" または "<%= 〜 %>" の内部に Ruby コードを記述します。後者の場合は、最後に評価した式の内容がその場所に出力されます。

さて、上記のビュー内の Ruby コードでは、@judge などのインスタンス変数らしきものをいくつか使用しています。それらには first コントローラの judge メソッド内で設定した値がそのまま引き継がれています。つまり、コントローラのインスタンス変数はビュー内のコードからもアクセスできるのです。これなら、コントローラからビューへのデータの受け渡しはとても簡単ですね(^^)

また、"link_to" というのは Ruby on Rails のサポートメソッドで、 Ruby on Rails の別のページへのリンクを作成するものです。このメソッドを使用することでアプリケーションの URL が変更されてもビューを書き換える必要がなくなりますので、リンクはできる限りこのメソッドで記述するようにしましょう。

first コントローラには page 以外にも 3 つのアクションを定義しましたが、それらのビューは page と同じでかまいません。render メソッドでテンプレートを変更するのが本筋ですが、ここではシンボリックリンクで複製してしまいます(^^;。

cd ~/RoR/app/views/first
ln -s page.rhtml rock.rhtml
ln -s page.rhtml paper.rhtml
ln -s page.rhtml scissors.rhtml

RoR The Rock-Paper-Scissors Game

これで「じゃんけんアプリ」の完成です。"http://localhost:3000/first/page" にアクセスすると、"rock", "paper", "scissors" の 3 つのリンクが表示されます。それらのうちのひとつをクリックすると、右図のように勝敗が表示されます。

いや、「だからなに?」と言われるとぐうの音も出ないのですが、とりあえず Ruby コードを実行して動的にページ内容を生成する方法はわかっていただけたのではないでしょうか。 Ruby on Rails でやる価値があるかは微妙ですが、今回ご紹介した知識だけでもけっこうなことが実現できると思います。なにか実装してみたい Web アプリケーションがあれば、ぜひ挑戦してみてください。

モデルは?

今回はデータベースを使用しない前提ですので、モデルに関してはほとんど触れられませんでした。前述のように、 Ruby on Rails でのモデルはデータベースの特定のテーブルそのものです(実際には対応する Ruby オブジェクトをスタブとして使用します)。そして、ここでも「設定より慣習」のポリシーにより非常に少ないコード量で実装できるようになっています。さらに "scaffold"(足場)という機能により、テーブルのカラム構成に対応した入力フォームを自動生成することまでできてしまいます。

このあたりのデータベースとの強力な連携こそが Ruby on Rails の真髄ですので、次回以降で詳しく触れていこうと思っています。非常に奥が深そうなので、じっくりとご紹介していきたいと思っています。是非ともよろしくお付き合いくださいませ(^^)

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles