ユーザーが存在する場合、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>");
});