====== コントローラの開発 ====== コントローラは、クライアントスクリプト(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を使った画面変更リクエストのプッシュには、ほんのわずかですがタイムラグがあると思われます。もしその間に画面変更が発生した場合、それを取りこぼすかもしれません。もしそのような現象が問題になるようなら、別な戦略が必要になると思われます。