如何在我的Rails应用程序中启动和停止javascript启动的查询?

时间:2011-08-29 21:55:53

标签: jquery ruby-on-rails ruby-on-rails-3 polling

我有一个应用,只要我的Publisher对象有新闻,就需要定期更新屏幕的“新闻”区域。当没有新闻时,屏幕的该区域被隐藏(或者根本不被渲染),并且更新停止。我用Ryan Bates的优秀Polling for Changes RailsCast作为起点,但我坚持了几点。

我的意图是,如果Publisher对象有新闻,则其show()方法会在其上呈现一个<div id='news'></div>的页面。 Javascript会注意到div并用发布者拥有的任何消息替换它(及其内容),并在5秒后重新触发。当发布者没有更多新闻时,Javascript将用空字符串替换<div id='news'></div>。在下一次触发时,将不再有<div id='news'></div>,因此重新触发过程将停止。至少,这是意图。

首先,问题:

  1. 虽然我知道我的部分被调用,但它不会在屏幕上产生明显的变化
  2. (或许与1相关)即使没有更多新闻要显示,javascript fn仍然会被调用。
  3. 简而言之,以下是重要部分:

    file:public / javascripts / application.js

    $(function () {  
      if ($('#news').length > 0) {  
        setTimeout(updateNews, 5000);
      }
    });  
    
    function updateNews() {  
        $.getScript('/publisher/update_news.js');  
        setTimeout(updateNews, 5000);
    }
    

    file:config / routes.rb

    resource :publisher, :only => [:show] do
      member {
        get :update_news
      }
    end
    

    file:app / controllers / publishers_controller.rb

    def show
    end
    
    def update_news
      @publisher = find_publisher
      unless (@publisher.has_news?)
        return head :ok
      end
      # otherwise should render views/publisher/update_news.js.html
    end
    

    file:app / views / publisher / show.html.erb

    <%= render :partial => 'publishers/show_news', 
               :locals => {:publisher => @publisher} %>
    

    file:app / views / publisher / update_news.js.erb

    <% t = escape_javascript(raw(render(:partial => 'publishers/show_news', 
                                        :locals => {:publisher => @publisher}))) %>
    $('#news').replace_with(' + <%= t %> + ');
    

    file:app / views / publisher / _show_news.html.erb

    <div id='news'>
      <h4>latest news</h4>
      <%= simple_format publisher.news %>
    </div>
    

    Rails.logger.debug消息告诉我,通过show()方法和javascript启动的updateNews()方法调用_show_news.html.erb部分。但我没有看到屏幕上的变化和(可能相关)updateNews函数继续在Publisher.has_news之后被调用?返回false。 (如果jQuery replace_with()函数总是以最初呈现的页面开始,而不是自己修改的结果,则会解释后一个问题。)

    所以这两个问题: 1.为什么我看不到屏幕的可见变化?我错误地使用了jquery的替换吗? 我对我停止更新的技术持怀疑态度。什么是正确的方式?

1 个答案:

答案 0 :(得分:1)

帮助调试:

使用fiddler(windows)或Mac tool查看浏览器上的html / jScript页面与服务器之间的确切内容。

您是否尝试过使用浏览器调试程序来了解正在发生的事情?

我的猜测是从.js.erb页面发送的js运行不正常。