0

ユーザーが存在する場合、fetch.js.erb をレンダリングするコントローラーがあります。私がやりたいことは、このファイルをレンダリングし、update_tweets を呼び出してユーザー オブジェクトを保存することです。現在、javascript がレンダリングされる前に update_tweets と save が呼び出されます。したがって、サブスクリプションがセットアップされる前に、faye メッセージが発行されます。javascript を強制的に早く実行するにはどうすればよいですか? 別のオプションは、何らかの方法で @user.update_tweets をノンブロッキングで呼び出すことですが、これを行う方法がわかりません。

user_controller.rb

class UserController < ApplicationController

  def fetch
    unless @user = User.find_by_name(params["user"])
      begin
        if Twitter.user(params["user"]).protected?
          render :private_user and return
        else
          @user = User.new(:name => params["user"])
        end
      rescue Twitter::Error::NotFound
        render :dne_user and return
      end
    end

    render :fetch
    @user.update_tweets
    @user.save
  end

end

user.rb

class User

  after_save do |user|
    puts "i've been saved!! sleeping now"
    sleep(20)
    user.tweets.each do |tweet|
      message = {:channel => "/" + self.name, :data => tweet.text }
      uri = URI.parse("http://localhost:9292/faye")
      puts Net::HTTP.post_form(uri, :message => message.to_json)
    end
  end

end

fetch.js.erb

client = new Faye.Client("http://localhost:9292/faye");
alert("running");
client.subscribe("/<%= @user["name"] %>", function(data) {
  $('#tweets').append("<p>"+data+"</p>");
});
4

1 に答える 1

0

呼び出しはrender呼び出されると出力を作成しますが、コントローラーが戻るまでブラウザーに送信されません。

とは言え、どうしてそんなことをしているのですか?呼び出す前に実際にユーザーの保存を行いrender、render メソッドが既に読み込まれているツイートを提供できるようにする必要があります。既にサービスを提供している場合は、faye を使用して、別の方法で解決しやすいものを解決しようとしています。クライアントは、fetch.js.erb でコンテンツを提供するだけです。

@user.id補足として、 の代わりにチャネルとして使用したい場合がありますname。同じ名前の人がいる可能性があり、同じ名前を持つ他の人へのメッセージを受け取る可能性があります。

于 2012-06-15T21:35:47.423 に答える