====== コントローラの開発 ======
コントローラは、クライアントスクリプト(JavaScript)とワーカーの仲介がほとんどで、かつそれらはフレームワークによって隠蔽されているので、非常に単純です。
===== コーディング =====
似た動作をするサンプルを見つけて、それをコピーする方法が簡単です。\\
IPCとServerSentEventsがあるので、チャットサンプルをコピーすると良さそうです。
cd /usr/local/kitchen_timer
cp controllers.bak/chat/main.rb controllers
cp controllers.bak/chat/index.rhtml controllers
コピーしたmain.rb を以下の通り編集します。
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require "al_form"
require "al_template"
require "al_worker_ipc"
class KitchenTimerContoller < AlController
include AlWorker::IpcAction
##
# constructor
#
def initialize()
@ipc = AlWorker::Ipc.open( "/tmp/kitchen_timer" )
end
#
# デフォルトアクションの定義
#
def action_index()
@values = @ipc.call( "get_values" )
AlTemplate.run( 'index.rhtml' )
end
end
編集のポイントは、以下の3点です。
* IPCノード名を、kitchen_timerに変更する。
* chatではrun_server()メソッドを使ってコントローラからサーバを常駐させているが、このプロジェクトではシステム起動時に常駐させるので、run_server()メソッド関連のコードは削除。
* テンプレート適用前に、IPC - get_valuesで、表示用の値を@valuesへコピーしておく。
表示用の値は、IPCにデフォルトで用意されている機能である get_values を使い取得します。そのため別途現在値を取得するIPCメソッドを記述することなく、ブラウザへ最新値を表示することが可能です。
(注意)ブラウザの表示(IPC-get_values) と、ServerSentEventsを使った画面変更リクエストのプッシュには、ほんのわずかですがタイムラグがあると思われます。もしその間に画面変更が発生した場合、それを取りこぼすかもしれません。もしそのような現象が問題になるようなら、別な戦略が必要になると思われます。