如何使用 Rails 4 轮询数据库中的一个值,如果值更改,则使用 AJAX 刷新

Posted

技术标签:

【中文标题】如何使用 Rails 4 轮询数据库中的一个值,如果值更改,则使用 AJAX 刷新【英文标题】:How to poll one value in a database with Rails 4, if value changes, refresh with AJAX 【发布时间】:2014-07-08 03:09:50 【问题描述】:

我已经使用 Rails 几年了,但这是我第一次尝试 AJAX 和 javascript。我花了很多时间阅读各种网站,试图弄清楚什么去哪里以及它应该做什么。

我试图让 Rails 4 应用程序中 edit.html.erb 中的 'refreshme' div 每次“故事”表中的“转”字段发生变化时都会刷新。所以我在story.js 中写了一个setInterval() 函数来检查@story.turn 和刷新。我可以让它每 10 秒刷新一次,但我只希望代码检查story.turn 每 10 秒的值,并且仅在值发生变化时刷新。

routes.rb(对吗?)

match '/stories/:id/refresh' => "stories#refresh", :as => :story_refresh, via: 'post'

refresh.html.erb(在视图/故事中 - 我不知道这里属于什么)

<div class="pollme" data-story-id="<%=@story.id %>" data-story-turn="<%=@story.turn %>" > 
  <%=@story.turn %> // This gets changed based on what other users are editing
</div>

edit.html.erb (views/stories) - show.html.erb 很好地刷新到这个 div 中

<div class="refreshme" data-story-id="<%=@story.id %>" data-story-turn="<%=@story.turn %>" >
  <%= render 'shared/micropost_form' %>
</div>

故事.js

$(document).on("page:change", function() 
  var $turn;
  $turn = $('.refreshme').data('story-turn'); 

  refreshStories = function()

    $.ajax(     
        type: "POST",
        data:   ,  // I'm sure something important goes here to get @story.turn out of the stories table
        url: "/stories/"+$('.refreshme').data('story-id')+"/refresh"    
    ).done(function(result) 
            alert('done' );
        $turn = ; // Not sure what data can return
    )

    if ($('.refreshme').data('story-turn') != $turn) 
      $.ajax(
        type: "GET", // helps show.html.erb get refreshed into refreshme div in edit.html.erb
        url: "/stories/"+$('.refreshme').data('story-id') 
      ).done(function(result) 
        var $sentence_requests = $('.refreshme');
        if ($sentence_requests.length > 0) 
            $sentence_requests.html(result);
            alert('UPDATED micropost requests ') ;
         else 
        
      )
    
  ;
  setInterval(refreshStories, 10000); 
);  

stories_controller.rb

def refresh
  @story = Story.find(params[:id])
  respond_to do |format|
    format.json    
    format.html  
  end  
end

def edit
  @story = Story.find(params[:id])
  @micropost  = @story.microposts.build
  respond_to do |format|
    format.json   
    format.html  
  end  
end

在 story.js 中,GET 函数执行,但 POST 函数不执行。我不确定我应该“发布”什么(我以为我正在从数据库中“获取”一个值,但我猜不是)。

我认为 POST 是我需要从 stories 表中获取 @story.turn 的 AJAX 函数,但不知道如何让它做任何事情。我还需要 GET 来刷新吗?我已经把这段代码混了好几个星期了,这似乎是我现在应该弄清楚的事情。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果您将它放在公共 github 存储库中,人们可以在上下文中看到您的代码,并且还可以发送拉取请求来展示他们将如何做到这一点。

【讨论】:

好的,乔,这是我的仓库。 github.com/crowdpublishtv/sentenceZing 我对它进行了一些编辑,因为我正在尝试 RailsCast 229,但这并没有真正达到我想要的效果。我需要更新@story.turn,以便在故事合作伙伴输入他们的故事微博后显示微博文本框。请参阅sentenceZing.com 以了解实施情况。 我尝试查看,但项目处于损坏状态:rake db:migrate 在全新安装时失败: 我尝试查看,但项目处于损坏状态:rake db:migrate 在全新安装时失败:SQLite3::SQLException: no such table: likes: ALTER TABLE "likes"添加“user_id”整数我不会花更多时间在这上面,但我的主要问题是:你为什么认为你需要一个 POST?您所需要的只是一个到达端点的 AJAX GET。让该端点查询数据库并返回一个响应,该响应为您提供足够的信息来说明“这个值没有 [not] 改变”。然后,根据该响应采取相应的行动。不需要 POST,这意味着您正在更改服务器上的数据。 这Angular question 也是相关的。 我知道它不能回答你的问题,但希望这足以让你摆脱困境。

以上是关于如何使用 Rails 4 轮询数据库中的一个值,如果值更改,则使用 AJAX 刷新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 4.0 表单中显示选定记录中的关联值

Rails:如何为 Rails activerecord 模型中的属性创建默认值? [复制]

在Rails中为Postgres JSON列设置默认值< 4

Rails 中的 respond_to 出现未知格式错误。正确尝试实施轮询更新

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

使用 EventMachine 的 Rails 应用程序是不是可以进行长轮询?