====== AlController コントローラ ======
MVCモデルのコントローラです。
ブラウザからのリクエストをトリガーに、ウェブサーバ経由で呼び出されます。
Aloneでは、「コントローラ」および「アクション」の2フェーズの概念があります。
{{:alcgi:ctrl_concept.png?nolink|}}
アプリケーションには、複数のコントローラがあり、コントローラは複数のアクションを内包します。\\
コントローラ名はそれぞれユニークでなければなりません。アクション名はコントローラが違えば同じ名前でもかまいません。
===== 呼び出されるアクションの決定 =====
アプリケーションを実行する際、どのコントローラを呼び出すか、そして指定されたコントローラ内のどのアクションを呼び出すのかはURL内に記述したctrlパラメータおよびactionパラメータで決まります。
http://www.example.com?ctrl=CONTROLLER_NAME&action=ACTION_NAME
* コントローラ名は ctrl=で、アクション名は action=で、与えられます。
* コントローラ名は、controllersディレクトリ内のサブディレクトリ名に一致します。
* アクション名は、main.rb内のメソッド名 action_XXX に一致します。
リクエストはAlControllerによって解析され、まずctrlパラメータで指定したコントローラ(ディレクトリ)が選ばれます。次に、そこにあるmain.rbに記述されたアクションの中から、actionパラメータで指定されたアクション(メソッド)が実行されます。なお、ctrlパラメータおよびactionパラメータはいずれも省略可能です。省略した場合、デフォルトコントローラおよびデフォルトアクションが指定されたことになります。
^ ctrl ^ action ^ 例 ^ 動作 ^
| 有り | 有り | example.com?ctrl=A&action=one | 指定コントローラの指定アクションを実行 |
| 有り | 無し | example.com?ctrl=A | 指定コントローラのデフォルトアクション(action_index)を実行 |
| 無し | 有り | example.com?action=one | デフォルトコントローラの指定アクションを実行 |
| 無し | 無し | example.com | デフォルトコントローラのデフォルトアクションを実行 |
※デフォルトコントローラ:al_config.rbで指定する、AL_CTRL_DIR= に定義したディレクトリ中のmain.rbを指す。
===== 簡単な使い方 =====
付属のhello worldアプリのクローンを、「hello」というコントローラ名で作ります。
==== 手順 ====
1. コントローラディレクトリ内に、コントローラ名と同じディレクトリを作る
cd /PATH/TO/INSTALLED_DIR
cd controllers
mkdir hello
cd hello
2. コントローラのメインファイル main.rb を作る
class HelloController < AlController
# デフォルトのアクション
def action_index()
puts "Hello world."
end
end
AlControllerクラスを継承して、適切な名前のクラスを定義します。\\
実際には継承しなくても、Rubyのオープンクラスにより同様の動作をしますが、今後のバージョンアップを考えコントローラごとにユニークな名前をつけておいてください。
3. 動作を確認する
内蔵のテスト用ウェブサーバで動作させている場合は、次のURLで動作を確認できます。\\
http://localhost:10080/index.rb?ctrl=hello
URLでコントローラ名に"hello"を指定している点に注目してください。\\
さらにこの場合は、アクション名を指定していませんので、デフォルトのアクション "action_index" が実行されます。
{{:alcgi:ctrl_hello1.png?nolink|}}
===== 動作シーケンス =====
{{:alcgi:ctrl_sequence.png?nolink|}}
ブラウザからのリクエストは、ウェブサーバを経由してAloneのコントローラによって解釈され、最終的に、main.rb中の適切なアクションメソッドが選択され呼び出されます。\\
アクションメソッド中で表示された文字列は、逆の経路でブラウザに伝えられ表示されます。
===== 別なアクションを定義する =====
コントローラのメインファイル main.rb へ、別なアクションを作ります。今回はアクション "another" を作ってみます。\\
以下のコードを、main.rbのクラス定義内に追記します。
def action_another()
puts "Hello another world."
end
内蔵のテスト用ウェブサーバで動作させている場合は、次のURLで動作を確認できます。\\
http://localhost:10080/index.rb?ctrl=hello&action=another
URLでコントローラ名に"hello"を指定している点、および、アクション名に"another"を指定している点に注目してください。\\
このようにして、機能ごとにアクションを追加していくことができます。
{{:alcgi:ctrl_hello2.png?nolink|}}
===== アクション以外のメソッド =====
action_プレフィクスが付いたメソッドは全てアクションとして呼び出すことができますが、それ以外の名前のメソッドはアクションとして呼び出す方法はありませんので、いわゆるサブルーチンとして使うことになります。
これは、外部(ブラウザ)から直接呼び出されるメソッドとそうでないメソッドが、ソースコードを見るだけで一目瞭然であるという優れた特徴があり、可読性、再利用性、セキュリティーなどの面において、大きなメリットになっています。