動的コンポーネントと静的コンポーネント
一般に、ウェブページでは1ページに複数の独立したコンポーネントで構成されます。 ウェブアプリも例外ではなく、表示されるコンテンツには、プログラムを使って生成され、状態によって内容が変わる動的コンポーネント(部分)と、CSSファイルやアイコン画像のように、内容が変化せずプログラムを介さない静的コンポーネントがあります。
ここで問題になるのは、ポータブルなアプリケーションを設計しようとした場合、それらコンポーネントを指示するURLに含まれるパスをどのようにするかということです。
動的コンポーネント
動的な内容をもったコンポーネントは、プログラムによって生成されます。そのため Alone では、必ずエントリポイントを介して開始されます。
例えば動的コンテンツでは、以下のようなURLでアクセスされます。
http://example.com/cgi-bin/index.rb?ctrl=controller1&action=action1
この例では、cgi-bin/index.rb がエントリポイントとなり、どのコンテンツも必ずこのエントリポイントとなるプログラムを開始地点とし、後に続くURLパラメータ等によってその後実行されるアクションが決定します。
もう一つ例を示します。 画面にグラフがある場合、テンプレートファイルに書く内容は例えば以下のようになります。
<img src="<%=h Alone.make_uri(action:'graph1', month:7) %>">
これがテンプレートマネージャによって展開され、実際にブラウザには以下のようなタグが送られます。
<img src="/cgi-bin/index.rb?ctrl=graph&action=graph1&month=7">
以上のように、動的コンポーネントの場合、make_uriメソッドにパラメータを与えてやるだけで、後はAloneが面倒を見てくれます。
静的コンポーネント
先の通り、動的コンテンツでは、以下のようなURLでアクセスされます。
http://example.com/cgi-bin/index.rb?ctrl=controller1&action=action1
この例では、cgi-bin以下でCGIを動作させる仕様だったため、cgi-binにエントリポイント index.rb を設置して動作させています。ここで生成されるページでアイコンを使いたい場合、以下のような imgタグをテンプレートファイルに書くでしょう。
<img src="img/icon1.png">
ところがこのような記述があると、ブラウザは、/cgi-bin/img/icon1.png からアイコンを読み込もうとしてしまい、意図通りには動作しません。それでは、絶対パスで指定するのはどうでしょうか。
<img src="/img/icon1.png">
今度は良さそうですね。ブラウザがアイコンを読み込むときに使う実際のURLも以下の通り意図したものになります。
http://example.com/img/icon1.png
通常の機器ならば、それを一つのアプリケーションで専有できるので、この方法で十分です。 ところが、アプリケーションをポータブルにしたい場合は、問題が発生します。
このアプリケーションを、サブディレクトリ /app1/ 以下で動作させたくなった場合はどうでしょうか。エントリポイントのURLはそこに移動することになるでしょう。
http://example.com/app1/index.rb
しかし、生成されるコンテンツ中では同じように絶対パスで動作するため、この場合も、/img から読み込もうとしてしまい、/app1/img からは読み込んでくれません。
Aloneのテンプレートでは、この問題に対処するための方法が用意してあります。
まず、al_config.rb に静的コンテンツのパスを設定します。
AL_URI_STATIC = "/app1"
htmlテンプレート中では、以下の通り記述します。
<img src="<%=s "icon1.png" %>">
その結果、以下のimgタグが生成されます。
<img src="/app1/icon1.png">
これで、app1を明日my-app1にしたくなっても、AL_URI_STATICを変更するだけでOKになります。