RailsでCometを使うにはJuggernaut1択なの?(Rails 2.3.5 で ShootingStar を動かしてみた)

ryan5500さんが、「今でもrailsでcometを実装するには、juggernaut一択なのかしら。Flashを使ってるのが嫌だなぁ。」と、つぶやいておられました。

いいえ、ShootingStarもあります。ShootingStarは @takiuchi さんが開発した、スケーラビリティの高いCometサーバー&Railsプラグインです。C言語で直接epoll/kqueueを使用して速いだけでなく、スケールアウトも考慮されたソフトウェアになっています。

と、答えたはいいんですが、2008年9月頃を最後にメンテナンスされなくなっているようなので、Rails 2.3.5で動くか試してみました。

ShootingStar 非公式Wiki - インストール に従って進めます。

 # ShootingStarをインストール
 $ sudo gem install shooting_star

 # railsのプロジェクトを作成
 $ rails hoge
 $ cd hoge

 # shooting_starの初期化
 $ shooting_star init

 # ShootingStarクライアントのMeteorStrikeをgenerate
 $ ruby script/generate meteor

 # chatアプリをgenerate
 $ ruby script/generate chat
 $ rake db:migrate

 # railsサーバを実行
 $ ruby script/server

別のターミナルで、

 # 初回はinitが要ります
 $ shooting_star init

 # shooting_star本体を実行
 $ shooting_star start

これで動けばよかったんですけど、まぁそんなにうまくは行きません。で、ちょちょっといじったんですが、幸いC言語やFlashで書かれた部分や本体Gemに変更を加えることなく、Railsプロジェクト内の変更だけで動かすことができました。

具体的には、以下のpatchを当てると動きます:

diff --git a/app/controllers/chat_controller.rb b/app/controllers/chat_controller.rb
index 93f3e7e..703aa24 100644
--- a/app/controllers/chat_controller.rb
+++ b/app/controllers/chat_controller.rb
@@ -24,7 +24,7 @@ class ChatController < ApplicationController
     @chat = Chat.new(
       :name => session[:name], :message => params[:message])
     if @chat.save
-      content = render_component_as_string :action => 'show', :id => @chat.id
+      content = render_to_string :template => 'chat/show'
       javascript = render_to_string :update do |page|
         page.insert_html :top, 'chat-list', content
       end
diff --git a/app/views/chat/index.rhtml b/app/views/chat/index.rhtml
index 40a99e2..c7b6b3e 100644
--- a/app/views/chat/index.rhtml
+++ b/app/views/chat/index.rhtml
@@ -7,8 +7,8 @@
   <%= submit_tag 'Talk' %><br />
 <% end %>
 <ul id="chat-list">
-  <% for chat in @chats %>
-    <%= render_component :action => 'show', :id => chat.id %>
+  <% for @chat in @chats %>
+    <%= render :template => 'show' %>
   <% end %>
 </ul>
 <%= meteor_strike 'chat', :uid => session[:name], :event => %Q{
diff --git a/vendor/plugins/meteor_strike/lib/meteor_strike/controller.rb b/vendor/plugins/meteor_strike/lib/meteor_strike/controller.rb
index 737feec..b5040b8 100644
--- a/vendor/plugins/meteor_strike/lib/meteor_strike/controller.rb
+++ b/vendor/plugins/meteor_strike/lib/meteor_strike/controller.rb
@@ -9,6 +9,7 @@ module MeteorStrike
     end
 
     def install_meteor_strike
+      parent_controller ||= false
       if parent_controller
         parent_controller.install_meteor_strike
       else

render_componentはRails 2.2で非推奨、2.3で廃止されましたので、動かなかったのですね。githubで管理されているので、気合がある時にforkしてpull-requestしてみたいと思います。(今日は疲れたのでまた今度……)


それでは、楽しいRails開発を!


twitter で無償 Rails サポートボランティアをやっています。"Rails" という単語で監視していますので、つぶやくと、解決方法を知っている場合は reply 致します。24時間監視はできませんので、なんらかの返事が欲しい場合は、直接 @babie までメッセージを下さい。また、動作確認・保証は行いませんのでご了承ください。