コントローラは、クライアントスクリプト(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にデフォルトで用意されている機能である get_values を使い取得します。そのため別途現在値を取得するIPCメソッドを記述することなく、ブラウザへ最新値を表示することが可能です。
(注意)ブラウザの表示(IPC-get_values) と、ServerSentEventsを使った画面変更リクエストのプッシュには、ほんのわずかですがタイムラグがあると思われます。もしその間に画面変更が発生した場合、それを取りこぼすかもしれません。もしそのような現象が問題になるようなら、別な戦略が必要になると思われます。