【问题标题】:How to poll one value in a database with Rails 4, if value changes, refresh with AJAX如何使用 Rails 4 轮询数据库中的一个值,如果值更改,则使用 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 来刷新吗?我已经把这段代码混了好几个星期了,这似乎是我现在应该弄清楚的事情。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript ruby-on-rails ajax ruby-on-rails-4 ajax-polling


    【解决方案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 也是相关的。
    • 我知道它不能回答你的问题,但希望这足以让你摆脱困境。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2012-10-22
    • 2022-01-20
    • 2013-04-21
    相关资源
    最近更新 更多