Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3用于更新表的AJAX解决方案?_Ruby On Rails_Ajax_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Rails 3用于更新表的AJAX解决方案?

Ruby on rails Rails 3用于更新表的AJAX解决方案?,ruby-on-rails,ajax,ruby-on-rails-3,Ruby On Rails,Ajax,Ruby On Rails 3,我知道这是一个很流行的话题,但我一直在寻找答案,奇怪的是没有找到任何能帮助我的东西 我有一个基本的Rails 3应用程序,在表中显示数据库条目。一个单独的应用程序将新条目发布到数据库中,我希望Rails应用程序轮询并刷新以显示新内容。现在,我有一个可怕的javascript片段,只是简单地重新加载整个页面,它被证明是我的障碍。我有一个搜索栏和检查栏来删除多个项目,但它们都是在页面刷新时重置的(同样,我知道这是可怕的和可怕的破坏) 根据我所读的内容,我认为我应该使用AJAX轮询数据库,并简单地呈现

我知道这是一个很流行的话题,但我一直在寻找答案,奇怪的是没有找到任何能帮助我的东西

我有一个基本的Rails 3应用程序,在表中显示数据库条目。一个单独的应用程序将新条目发布到数据库中,我希望Rails应用程序轮询并刷新以显示新内容。现在,我有一个可怕的javascript片段,只是简单地重新加载整个页面,它被证明是我的障碍。我有一个搜索栏和检查栏来删除多个项目,但它们都是在页面刷新时重置的(同样,我知道这是可怕的和可怕的破坏)

根据我所读的内容,我认为我应该使用AJAX轮询数据库,并简单地呈现比显示的最新条目更新的数据库条目。如何准确执行这是另一个故事

我发现的大多数教程都已经过时,并且我无法运行遗留代码。我对AJAX和Rails都是新手,如果有人能给我提供任何指导、建议、教程或个人批评(:P),我会非常乐意

谢谢

编辑:我已将新条目拉入页面,但它们根本无法正确呈现。由于某些原因,它们没有作为条目添加到我的表中。这是我的代码,希望你们能找出我遗漏的东西: *注意->请求实际上是我的数据库条目的名称。请求是模型

视图/请求/index.html.erb

部分请求:views/requests/_Request.html.erb

“你确定吗?”,:method=>:delete%>
视图/请求/index.js.erb
$(“#请求”)。追加(“”);
这是怎么回事

另一套是:

有时候,利用现有的比建造新的更好

但要回答您的问题,这取决于您是自己操作DOM,还是让Prototype、jQuery、MooTools或其他什么来完成繁重的工作。这个想法是在Javascript中设置一个计时器,当计时器启动时,请求服务器进行更新。服务器——您的Rails应用程序——将打包所有已更改的内容并将其发送回

步骤1:决定一个框架。我使用jQuery,但大多数都可以

步骤2:决定数据格式。我使用JSON,但XML可以

步骤3:设置计时器循环。它包括使用settimer()并在每次观察后重置它

步骤4:在计时器启动时执行的处理程序中,打包一个“最后看到的”时间戳并发出Ajax请求。如何实现这一点因框架而异——或者,如果您是针对DOM编写代码,则在不同的浏览器中也会有所不同

步骤5:设置一个“成功”处理程序,以便当服务器返回零行或多行数据时,可以在表中插入这些TR-TD-/TD-/TR行

步骤6:更新任何内部垃圾,如数字或行计数器或Javascript正在跟踪的任何其他内容


注意:您可能会发现有其他人编写的插件可以很好地工作并为您省去麻烦,但您应该对如何完成这项工作有一个基本的了解。

首先创建一个可以获取新条目的rails端点:

# config/routes.rb
match '/records/new_since/:time', :to => 'records#new_since'

# app/controllers/records_controller.rb
class RecordsController < ApplicationController
  def new_since 
    @records = Record.where('created_at > ?', Time.parse(params[:time]))
    respond_to do |format|
      format.json do
       @records[:time] = Time.now.to_s(:db)
       render :json => @records.to_json
      end
    end
  end
end
#config/routes.rb
匹配“/records/new_-since/:time”,:to=>“records#new_-since”
#app/controllers/records\u controller.rb
类记录控制器<应用程序控制器
def new_自
@records=Record.where('created_at>?',Time.parse(params[:Time]))
回应待办事项|格式|
format.json do
@记录[:time]=时间.now.to_s(:db)
render:json=>@records.to_json
结束
结束
结束
结束
然后,在客户端使用一点javascript(这里是原型):

setInterval(
函数(){
新的Ajax.Request('/records/new_-since/'+$('time')+'.json'{
方法:“get”,
onSuccess:功能(传输){
var记录=transport.response.responseJSON;
//将上次检查的时间插入到
$('time').innerHTML=records.time;
//循环响应JSON并对数据执行所需操作
记录。每个功能(记录){
$$('table#records')。插入({
底部:“”+记录。属性+“”;
});
});
}
});
},
30000
);
或者,您也可以呈现一个包含所有新表行的模板,而不是发送json,并将其也加入其中。不太灵活,但如果您只想将响应放在底部,则要简单一点:

def new_since
  @records = Record.where('created_at > ?', Time.parse(params[:time]))
  respond_to do |format|
    format.json {} # renders json template
  end
end

# app/views/records/new_since.html.json.erb
<% records.each do |record| %>
  <tr><td><%= record.attribute %></td></tr>
<% end %>

setInterval(
  function(){
    new Ajax.Request('/records/new_since/' + $('time') + '.json', {
      method: 'get',
      onSuccess: function(transport){
        var record_rowss = transport.response.responseText;
        $('time').innerHTML = records.time;
        $$('table#records').insert({bottom: record_rows});
      }
    });
  },
  30000
);
def new\u自
@records=Record.where('created_at>?',Time.parse(params[:Time]))
回应待办事项|格式|
format.json{}#呈现json模板
结束
结束
#app/views/records/new_-since.html.json.erb
设定间隔(
函数(){
新的Ajax.Request('/records/new_-since/'+$('time')+'.json'{
方法:“get”,
onSuccess:功能(传输){
var record_rowss=transport.response.responseText;
$('time').innerHTML=records.time;
$$('table#records')。插入({bottom:record_rows});
}
});
},
30000
);

刚刚找到。我喜欢Railscasts,我将浏览一下它,看看它是如何运行的。DataTables看起来非常棒,我一定会去看看。我一直在关注我为回答我的问题而发布的教程,实际上我很好地呈现了新条目(它使用jQuery,并且几乎相同地遵循您的步骤)。不幸的是,新显示的内容没有使用表的CSS呈现?有没有什么明显的原因可以解释为什么会发生这种情况,但我可能没有注意到?很难说没有看到CSS和Ajax的响应。表格是很棘手的,因为浏览器必须真正理解整个内容,才能在页面上正确布局表格。我建议查看Firebug中的样式和计算样式
$('#requests').append("<%=raw escape_javascript(render(@requests))%>");
# config/routes.rb
match '/records/new_since/:time', :to => 'records#new_since'

# app/controllers/records_controller.rb
class RecordsController < ApplicationController
  def new_since 
    @records = Record.where('created_at > ?', Time.parse(params[:time]))
    respond_to do |format|
      format.json do
       @records[:time] = Time.now.to_s(:db)
       render :json => @records.to_json
      end
    end
  end
end
setInterval(
  function(){
    new Ajax.Request('/records/new_since/' + $('time') + '.json', {
      method: 'get',
      onSuccess: function(transport){
        var records = transport.response.responseJSON;
        // insert the last checked time into <div id='time'></div>
        $('time').innerHTML = records.time;
        // loop over response JSON and do what you want with the data
        records.each(function(record){
          $$('table#records').insert({
            bottom: '<tr><td>'+record.attribute+'</td></tr>';
          });
        });
      }
    });
  },
  30000
);
def new_since
  @records = Record.where('created_at > ?', Time.parse(params[:time]))
  respond_to do |format|
    format.json {} # renders json template
  end
end

# app/views/records/new_since.html.json.erb
<% records.each do |record| %>
  <tr><td><%= record.attribute %></td></tr>
<% end %>

setInterval(
  function(){
    new Ajax.Request('/records/new_since/' + $('time') + '.json', {
      method: 'get',
      onSuccess: function(transport){
        var record_rowss = transport.response.responseText;
        $('time').innerHTML = records.time;
        $$('table#records').insert({bottom: record_rows});
      }
    });
  },
  30000
);