究竟什么时候轨道控制器实际渲染?

时间:2012-06-10 20:16:28

标签: ruby-on-rails-3 faye

如果用户存在,我有一个呈现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>");
});

1 个答案:

答案 0 :(得分:0)

render调用将在调用时创建输出,但在控制器返回之前不会发送到浏览器。

那就是说,你为什么这样做呢?你应该在调用render之前真正保存用户并让渲染方法服务已经加载的推文,你试图用faye来解决一些更容易以不同方式解决的问题,如果你已经服务于客户端,在fetch.js.erb中,只是从中提供内容。

作为旁注,您可能希望使用@user.id作为频道,而不是name,可能会有同名的人,他们会为同名的其他人获取消息,除非那是你打算做的。