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 までメッセージを下さい。また、動作確認・保証は行いませんのでご了承ください。