0

如果用户存在,我有一个呈现 fetch.js.erb 的控制器。我想要做的是渲染这个文件,然后调用 update_tweets 并保存在用户对象上。目前,在呈现 javascript 之前调用 update_tweets 和 save。因此,faye 消息在订阅设置之前被发布。如何强制 javascript 提前执行?另一种选择是以某种方式以非阻塞方式调用@user.update_tweets,但我不确定如何执行此操作。

用户控制器.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

用户.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并让渲染方法为已经加载的推文提供服务,如果你已经在为客户端,在 fetch.js.erb 中,只提供其中的内容。

作为旁注,您可能希望将其@user.id用作频道而不是name,可能会有同名的人,他们会收到其他同名的人的消息,除非您打算这样做。

于 2012-06-15T21:35:47.423 回答