こんにちは、まっつんです。今回から、Ruby on Rails (以下、Rails) で ポテトバーガー注文アプリケーション を実装していきます。
まずは実装にあたって必要なソフトウェアのインストールを行いましょう。
各種ソフトウェアのインストール
さて、「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 | アプリケーションのログ |
| public | JavaScript や 画像、CSS といった静的なファイル |
| script | Rails が提供するさまざまなスクリプト |
| 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 にアクセスして動作確認を行いましょう。
ルートの定義
ポテトバーガー注文アプリケーション では、メインメニューの選択、サイドメニューの選択、確認、完了という 4 ページがあります。今回は各ページに対して、以下のように URI を割り当てます。
| ページ | URI | メソッド |
|---|---|---|
| メインメニューの選択ページ | /orders/order/main_menu | GET |
| サイドメニューの選択ページ | /orders/order/side_menu | GET |
| 確認ページ | /orders/order/confirmation | GET |
| 完了ページ | /orders | POST |
それでは 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 にアクセスして動作確認を行いましょう。
おわりに
今回は ポテトバーガー注文アプリケーション の実装に重点をおいて進めました。次回は Rails を使った RESTful な Web アプリケーションの実装について詳しく見ていきたいと思います。
実は今回の実装では、バリデーション を行っていません。いろいろと試してみたのですが、どうも良い方法が見出せなかったので今回は見送りました。とはいえバリデーションがなければ、アプリケーションとして成り立たないので、次回以降に実装したいと思います。
使用したソフトウェアのバージョン
| Ruby on Rails | 2.3.2 |
|---|---|
| WEBrick | 1.3.1 |
参考文献
トラックバック(0)
- このブログ記事のトラックバックURL:
