2012-06-10 106 views
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>"); 
}); 

回答

0

render調用調用時會造成輸出,但它贏得了」直到您的控制器返回,纔會發送到瀏覽器。

這就是說,你爲什麼這樣做?在調用render之前,你應該真的做到保存用戶,並讓render方法提供已經加載的推文,你試圖用faye解決一些更容易以不同方式解決的問題,如果你已經服務於fetch.js.erb中的客戶端只是提供來自它的內容。

作爲一個附註,您可能想要使用@user.id作爲頻道而不是name,可能會有同名的人,誰會爲其他人使用相同的名稱獲得消息,除非這是您打算執行的操作。