Ruby on rails Rails 3用于更新表的AJAX解决方案?
我知道这是一个很流行的话题,但我一直在寻找答案,奇怪的是没有找到任何能帮助我的东西 我有一个基本的Rails 3应用程序,在表中显示数据库条目。一个单独的应用程序将新条目发布到数据库中,我希望Rails应用程序轮询并刷新以显示新内容。现在,我有一个可怕的javascript片段,只是简单地重新加载整个页面,它被证明是我的障碍。我有一个搜索栏和检查栏来删除多个项目,但它们都是在页面刷新时重置的(同样,我知道这是可怕的和可怕的破坏) 根据我所读的内容,我认为我应该使用AJAX轮询数据库,并简单地呈现比显示的最新条目更新的数据库条目。如何准确执行这是另一个故事 我发现的大多数教程都已经过时,并且我无法运行遗留代码。我对AJAX和Rails都是新手,如果有人能给我提供任何指导、建议、教程或个人批评(:P),我会非常乐意 谢谢 编辑:我已将新条目拉入页面,但它们根本无法正确呈现。由于某些原因,它们没有作为条目添加到我的表中。这是我的代码,希望你们能找出我遗漏的东西: *注意->请求实际上是我的数据库条目的名称。请求是模型 视图/请求/index.html.erbRuby 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轮询数据库,并简单地呈现
部分请求: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
);