====== AJAXによる更新 ======
昨今のウェブアプリでは、JavaScriptによるクライアントサイドプログラムとの協業が欠かせません。
ここでは、サーバサイドにRESTインタフェースを作り、AJAXによる画面更新の例を紹介します。
{{ :prog_cgi:ajax_result.png?direct&300|}}
====== 作成するアプリ ======
* 数字入力欄を4つ用意する。
* 数字を入力すると、即座にその値を表した棒グラフが表示される。
* 数字を変えると、棒グラフもリアルタイムに変わる。
====== 実装開始 ======
hello worldをベースにします。リスト表示の時ややこしいので、READMEファイルは削除しておいてください。
cd controllers
cp -r 00_hello ajax
cd ajax
rm README
コントローラ名を、変更します。併せてrequireを以下の通り修正してください。
require "alone"
require "al_graph"
class AjaxSampleController < AlController
===== デフォルトアクションの実装 =====
コントローラは、不要なコードを削除した程度で、機能の変更はありません。
def action_index()
AlTemplate.run("index.rhtml")
end
デフォルトの画面は、今回静的なものなので、本来ならばテンプレート化する必要もありません。
<%= header_section %>
<%= body_section %>
値1
===== AJAXによる更新 =====
Aloneでは、サーバサイドとの連携のためのJavaScriptライブラリ、"alone.js" を同梱していますので、それを使います。
また、今回はクライアントサイドの補助ライブラリとして、jqueryを使っています。
JavaScriptでは、各テキストボックスに値が入力されたことをトリガーに動作を始めます。
そのハンドラでは、AJAX通信を使ってグラフ生成のREST-APIを使い、結果を
値2
値3
値4
<%= footer_section %>
===== REST APIの実装 =====
実際にグラフを描画する機能を、REST APIとして実装します。
Aloneでは、ブラウザからのアクセスは全て action に割り当てられます。先ほど、JavaScriptのコード中で、"get_graph"と名前をつけていますので、def action_get_graph と定義することになります。
def action_get_graph()
form = AlForm.new(
AlText.new("v1"),
AlText.new("v2"),
AlText.new("v3"),
AlText.new("v4"),
)
form.validate()
ydata = [ form[:v1].to_f, form[:v2].to_f, form[:v3].to_f, form[:v4].to_f ]
graph = AlGraph.new()
graph.set_mode( :NO_XML_DECLARATION )
graph.add_data_bar(ydata)
graph.draw()
end
パラメータとして渡された v1からv4を取得するために、AlFormを定義します。
AlGraphオブジェクトを作り、formから得た値を add_data_bar()メソッドに与えることで、棒グラフを生成します。
set_mode()メソッドで、:NO_XML_DECLARATION モードを設定していますが、この指示をすることでグラフ生成結果にDOCTYPE宣言とxml宣言をしなくなります。
現在のブラウザでは、この指示をしてもしなくても正しく動作するものがほとんどですが、念の為つけています。
これで完了です。
{{:prog_cgi:ajax_result.png?nolink|}}
===== プログラム全体 =====
プログラム全体を再掲します。
* コントローラ main.rb
* テンプレート(ビュー) index.rhtml
require "alone"
require "al_graph"
class AjaxSampleController < AlController
def action_index()
AlTemplate.run("index.rhtml")
end
def action_get_graph()
form = AlForm.new(
AlText.new("v1"),
AlText.new("v2"),
AlText.new("v3"),
AlText.new("v4"),
)
form.validate()
ydata = [ form[:v1].to_f, form[:v2].to_f, form[:v3].to_f, form[:v4].to_f ]
graph = AlGraph.new()
graph.set_mode( :NO_XML_DECLARATION )
graph.add_data_bar(ydata)
graph.draw()
end
end
<%= header_section %>
<%= body_section %>
値1
値2
値3
値4
<%= footer_section %>