====== コントローラアプローチによるHello Worldアプリケーション ======
[[ダイレクトアプローチによる_hello_world_アプリケーション|ダイレクトアプローチによるHello Worldアプリケーション]]で作成した「Hello World」アプリケーションをコントローラアプローチで作り直してみます。
Aloneはアプリケーションの開発方法として、ダイレクトアプローチとコントローラアプローチの二通りの方法に対応しています。
コントローラアプローチでは、データ操作、画面生成、ユーザー操作の受付の三つに大きく機能を分割するMVCモデルを適用してアプリケーションを開発することができます。
ダイレクトアプローチは小さなツールを手早く簡潔に記述するという、CGIの延長のような利用方法が適しています。一方コントローラアプローチは、より規模の大きなアプリケーション開発でも機能を適切に分割しながらメンテナンス製の高いアプリケーションを効率よく開発することができます。
===== コントローラアプローチ版「Hello World」アプリケーションの開発 =====
==== 1. 作業用ディレクトリの作成 ====
「Hello World」アプリケーションの開発作業を行うためのディレクトリを作成します。
mkdir hello_world_with_controller
==== 2. Aloneを構成するファイルをコピー ====
Aloneの配布ファイルのうちlibディレクトリを前項の手順で作成したhello_world_with_controllerディレクトリにコピーします。
cp -r alone/lib hello_with_controller/
==== 3. lib/al_config.rbの設定 ====
コントローラモデルで開発を行う場合、lib/al_config.rb内のAL_CTRL_DIR定数にアプリケーションを導入するディレクトリを指定しなければなりません。AL_CTRL_DIRは、ユーザーが開発したコントローラをAloneが検索する際の起点となります。
lib/al_config.rb内のAL_CTRL_DIR定数を次のように書き換えてください。RubyのFile.joinメソッドは与えられた文字列をディレクトリ名の区切り文字(UNIX系OSの場合は'/'、Windowsの場合は'\')で結合します。AL_BASEDIR定数は通常はAloneのlibディレクトリを指すので、以下の設定例ではAL_CTRL_DIRはlibディレクトリの直上、つまりhello_world_with_controllerディレクトリを指します。
AL_CTRL_DIR = File.join(AL_BASEDIR, "../")
==== 4. エントリポイントの記述 ====
エントリポイントは、コントローラアプローチで開発したアプリケーションで最初に実行される部分です。webアプリケーションからCGIプログラムとして起動されます。ここでAloneの設定を記述したal_config.rbとコントローラの機能を提供するAloneのクラスAlControllerクラスが定義されているal_controller.rbを読み込みます。
読み込まれたAlControllerはURLやPOSTデータなどリクエストの解析を行い、ユーザーが定義したコントローラに処理を引き継ぎます。
エントリポイントの記述例を以下に示します。index.rbというファイル名で作成してください。
#!/usr/bin/env ruby
# encoding: utf-8
require 'lib/al_config'
require 'al_controller'
==== コントローラの記述 ====
hello_world_with_controllerディレクトリ内にmain.rbというファイルを作成し、コントローラの内容を記述していきます。
コントローラを記述する際のファイル名はmain.rbで固定です。main.rbは、lib/al_config.rb内のAL_CTRL_DIR定数で指定したディレクトリ直下に置くか、そのディレクトリ内にさらにサブディレクトリを作成して設置します。
AL_CTRL_DIR直下に置いた場合は、そのコントローラはデフォルトコントローラとして扱われます。Aloneにおいて実行するコントローラの指定はURL内のcrrlパラメータで行いますが、明示的にコントローラが指定されていない場合はデフォルトコントローラが呼び出されます。AL_CTRL_DIR以下にサブディレクトリを作成してmain.rbを置いた場合、ディレクトリ名がコントローラ名として扱われます。例えば、fooというサブディレクトリ下にmain.rbを置いた場合、コントローラ名はfooとなり、このコントローラ内の機能を呼び出す際のctrlパラメータの値はfooです。
これから作成するアプリケーションはコントローラは一つだけですので、デフォルトコントローラのみ作成することにします。main.rbという名前のファイルを以下の内容で作成してください。
require 'al_template'
#
#
#
class AlController
def action_index()
@my_message = "Hello world."
AlTemplate.run( 'index.rhtml' )
end
end
外部に公開する機能、すなわちwebブラウザの操作で呼び出される機能をアクションといいます。アクションの定義は、AlControllerに名前がaction_で始まるメソッドを追加することで行います。この例では、indexというただ一つのアクションのみが定義されています。
なお、indexという名前のアクションはデフォルトアクションと呼び、リクエスト内で明示的にアクション名が指定されていないときに実行されます。リクエスト内でコントローラ名もアクション名も指定されていない場合は、デフォルトコントローラ内のデフォルトアクションが実行されます。
==== 6. テンプレートファイルの記述 ====
ダイレクトアプローチによるアプリケーションと同様、テンプレートファイルを記述します。以下の内容でindex.rhtmlを作成してください。
<%= header_section %>
Test
<%= body_section %>
<%=h @my_message %>
<%= footer_section %>
以上で完成です。hello_worldディレクトリの中には以下のファイル・ディレクトリが存在するはずです。
| index.rb | アプリケーションのエントリポイントです。ここから実行が開始され、リクエストの解析を行った後に適切なコントローラに処理が引き継がれます。 |
| index.rhtml | アプリケーションからHTTPレスポンスとして返される画面を生成するための雛形です。HTML内に一部Rubyのコードが埋め込まれたERBで記述します。 |
| main.rb | デフォルトコントローラです。リクエストにおいてコントローラ名が明示的に指定されていない場合はこのコントローラ内のアクションが実行されます。 |
| lib/ | Aloneのライブラリ群が格納されたディレクトリです。設定ファイルal_config.rbや開発環境で使用する簡易webサーバ al_server.rb も含まれています。|
===== アプリケーションの実行 =====
それでは、作成したアプリケーションを実行してみましょう。
ダイレクトアプローチのチュートリアルと同様、al_server.rbで実行することができます。
ruby lib/al_server.rb .
webブラウザでhttp://localhost:10080/にアクセスしてみてください。「Hello World」アプリケーションによって生成された画面が表示されます。
{{:handbook:hello_world_otuput.png|}}