こんにちは、まっつんです。今回から、Ruby on Rails (以下、Rails) で ポテトバーガー注文アプリケーション を実装していきます。

まずは実装にあたって必要なソフトウェアのインストールを行いましょう。

MATSUFUJI Hideharu

各種ソフトウェアのインストール

さて、「Getting Started with Rails」に従ってプロジェクトを作成していくわけですが、このドキュメントではデータベースに SQLite を使用した例が最初に紹介されています。そこで今回はデータベースに SQLite を使用することにします。

また Rails に含まれている Web サーバ WEBrick が依存しているライブラリも合わせてインストールします。

sudo aptitude install libopenssl-ruby
sudo aptitude install ruby1.8-dev
sudo aptitude install sqlite3
sudo aptitude install libsqlite3-dev
gem install sqlite3-ruby

プロジェクトとデータベースの作成

それでは「Getting Started with Rails」 の 「3 Creating a New Rails Project」に従って、プロジェクトを作成しましょう。

rails conversation

rails コマンドによって conversation プロジェクトに作成されるディレクトリとそれぞれの役割は以下のとおりです。これらのディレクトリのうち、開発者が主に利用するのは app, config, db となります。

ディレクトリ役割
appアプリケーションのモデル、ビュー、コントローラ、ヘルパー
configデータベースやフレームワークの構成ファイル
dbデータベーススキーマやマイグレーションファイル
docドキュメント
libアプリケーションの拡張モジュール
logアプリケーションのログ
publicJavaScript や 画像、CSS といった静的なファイル
scriptRails が提供するさまざまなスクリプト
testユニットテスト
tmp一時ファイル
vendorサードパーティのライブラリ

次にデータベースを作成します。

cd /path/to/conversation
rake db:create

Rake は Ruby におけるビルドプログラムです。make を参考に実装されており、Rake のタスクを定義する Rakefile は Ruby の構文で記述することができます。

ポテトバーガー注文アプリケーションとは?

ここで今回実装する ポテトバーガー注文アプリケーション について簡単に説明します。

ポテトバーガー注文アプリケーション は筆者たちが開発している PHP フレームワーク Piece Framework のクィックスタートドキュメント「Piece Framework で作る対話的なアプリケーション」で題材となっているサンプルアプリケーションで、メインメニューの選択、サイドメニューの選択、確認、完了の 4 ページで構成されています。

このアプリケーションは、ページの遷移やデータベースへの登録といった Web アプリケーションで必ず出てくる処理を盛り込んでおり、あるフレームワークの特徴を掴むためにもってこいの題材といえるでしょう。

Scaffolding

Rails にはその特徴を語る上でいくつかのキーワードがあります。この Scaffolding もそのひとつです。

Scaffold とは「足場」または「足場を組む」という意味であり、Scaffolding は「足場を組むこと」を意味します。Rails は、リソースの定義からモデル、ビュー、コントローラを素早く作成するコマンドラインツールを提供しており、それらによって開発者は Scaffolding を実行することができます。

今回はこの Scaffolding によって、基本となるモデル、ビュー、コントローラを作成していきます。リソースを Order とし、メインメニュー、サイドメニューをそれぞれ main, side というフィールド名で定義します。

script/generate scafold Order main:integer side:integer

次に、Scaffolding で作成されたデータベースのマイグレーションファイルを使ってデータベースにテーブルを作成します。

rake db:migrate

このデータベースのマイグレーションも興味深い技術であり、いろいろと見てみたいのですが、今回は実装を優先することにします。

WEBrick の起動

Rails には WEBrick という Web サーバが含まれており、これを使って簡単にアプリケーションの動作確認を行うことができます。

以下のコマンドで WEBrick を起動することができます。

script/server

http://localhost:3000/orders にアクセスして動作確認を行いましょう。

orders-index.png

ルートの定義

ポテトバーガー注文アプリケーション では、メインメニューの選択、サイドメニューの選択、確認、完了という 4 ページがあります。今回は各ページに対して、以下のように URI を割り当てます。

ページURIメソッド
メインメニューの選択ページ/orders/order/main_menuGET
サイドメニューの選択ページ/orders/order/side_menuGET
確認ページ/orders/order/confirmationGET
完了ページ/ordersPOST

それでは URI のマッピングを行っていきましょう。Rails では、URI のマッピングを config/routes.rb で行います。

  map.resources :orders,
    :path_names => {:new => 'order'},
    :new => {:main_menu => :get, :side_menu => :get, :confirmation => :get}

まず :path_names オプションを使って、new に割り当てられる URI を order にマッピングします。これで /orders/order にアクセスしたときに、コントローラの new メソッドが実行されるようになります。

次に :new で main_menu, side_menu, confirmation の各ページを追加します。なお、これらのページは HTTP メソッド GET にのみ対応するようにします。

これで URI のマッピングは完了です。URI のマッピング状況は rake コマンドで確認することができます。

rake routes

(in /path/to/conversation)
...
   main_menu_new_order GET    /orders/order/main_menu(.:format)    {:controller=>"orders", :action=>"main_menu"}
confirmation_new_order GET    /orders/order/confirmation(.:format) {:controller=>"orders", :action=>"confirmation"}
   side_menu_new_order GET    /orders/order/side_menu(.:format)    {:controller=>"orders", :action=>"side_menu"}
                       POST   /orders(.:format)                    {:controller=>"orders", :action=>"create"}
...

コントローラの実装

次にコントローラを実装します。

app/controllers/orders_controller.rb
class OrdersController < ApplicationController
  ...
  def main_menu
  end

  def side_menu
    @main = params[:main]
  end

  def confirmation
    @order = Order.new
    @order.main = params[:main]
    @order.side = params[:side]

    main_index = @order.main - 1
    side_index = @order.side - 1

    @main = ['ジャーマンポテトバーガー', 'ポテトコロッケバーガー', '肉じゃがバーガー'][main_index]
    @side = ['フライドポテト', 'ポテトサラダ', 'スイートポテト'][side_index]
    @price = [650, 600, 700][main_index]
  end

  def create
    @order = Order.new(params[:order])

    if @order.save
      render :action => 'finish'
    end
  end
  ...
end

main_menu, side_menu, confirmation メソッドはそれぞれメインメニューの選択、サイドメニューの選択、確認の各ページに対応しています。今回は REST アーキテクチャスタイルに則って、ステートレスに動作させるため選択されたメインメニュー、サイドメニューをリクエストパラメータで渡すようにしています。

最後の create メソッドで実際にデータを登録する処理を行います。Scaffolding によって作成されたコントローラは、必要なすべてのデータをリクエストパラメータから取得します。Rails は、このように HTTP メソッドと URI の組み合わせに対してコントローラのメソッドをマッピングすることで REST を実現しています。

今回のチャレンジの主な目的は Rails を使った RESTful な Web アプリケーションの実装を知ることなので、この部分については次回に詳しく見ていきます。

ビューの実装

最後にビューを実装します。

app/views/main_menu.html.erb
<h3>ご注文は何になさいますか?</h3>
<ul>
  <li><%= link_to 'ジャーマンポテトバーガー (650円)', "#{orders_path}/order/side_menu?main=1" %></li>
  <li><%= link_to 'ポテトコロッケバーガー (600円)', "#{orders_path}/order/side_menu?main=2" %></li>
  <li><%= link_to '肉じゃがバーガー (700円)', "#{orders_path}/order/side_menu?main=3" %></li>
</ul>
app/views/side_menu.html.erb
<h3>サイドメニューは何になさいますか?</h3>
<ul>
  <li><%= link_to 'フライドポテト', "#{orders_path}/order/confirmation?main=#{@main}&side=1" %></li>
  <li><%= link_to 'ポテトサラダ', "#{orders_path}/order/confirmation?main=#{@main}&side=2" %></li>
  <li><%= link_to 'スイートポテト', "#{orders_path}/order/confirmation?main=#{@main}&side=3" %></li>
</ul>
app/views/confirmation.html.erb
<h3>注文内容は以上で宜しいですか?</h3>
<ul>
  <li>メインメニュー:<%=h @main %></li>
  <li>サイドメニュー:<%=h @side %></li>
</ul>
<div>小計: <%=h @price %>円</div>

<% form_for(@order) do |f| %>
  <%= f.hidden_field :main %>
  <%= f.hidden_field :side %>
  <%= link_to_function 'OK', "document.forms[0].submit()" %> 
  <%= link_to '選びなおす', "#{orders_path}/order/main_menu" %>
<% end %>
app/views/finish.html.erb
<h3>ご注文ありがとうございました。</h3>

<%= link_to '登録した注文を参照する', "#{orders_path}/#{@order.id}" %><br />
<%= link_to 'はじめに戻る', "#{orders_path}/order/main_menu" %>

REST では、それぞれのリソースの関連を示すリンクが重視されるため、完了ページでは注文された内容を参照するためのリンクを表示するようにしています。

以上で ポテトバーガー注文アプリケーション が動作するようになりました。 http://localhost:3000/orders/order/main_menu にアクセスして動作確認を行いましょう。

order-main-menu.png order-side-menu.png order-confirmation.png order-finish.png

おわりに

今回は ポテトバーガー注文アプリケーション の実装に重点をおいて進めました。次回は Rails を使った RESTful な Web アプリケーションの実装について詳しく見ていきたいと思います。

実は今回の実装では、バリデーション を行っていません。いろいろと試してみたのですが、どうも良い方法が見出せなかったので今回は見送りました。とはいえバリデーションがなければ、アプリケーションとして成り立たないので、次回以降に実装したいと思います。

使用したソフトウェアのバージョン

Ruby on Rails2.3.2
WEBrick1.3.1

参考文献

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント