1

我在 rails 视图中有一个自行车列表,自行车数据库每分钟通过一个 cron-job 更新。

如何使 ajax 调用仅呈现从 cron 作业在数据库中创建的新记录的一部分?

例如:

当前视图是所有自行车: 自行车 A 自行车 B 自行车 C

Cron 工作增加了另一辆自行车:Bike D

我想单击一个链接以进行 ajax 调用以呈现仅将 Bike D 添加到视图的部分

控制器:

def index
  @bikes = Bike.order('created_at DESC').limit(50).all

  respond_to do |format|
    format.js { render :bike_post_ajax }
    format.html
  end
end

看法:

<%= link_to 'update bikes', bikes_path, :remote=> true %> #link to Ajax call

<table>
<% @bikes.each do |bike| %>
  <%= render 'bike_post', :bike => bike %>
<% end %>
</table>

bike_post_ajax.js.erb

$('table').prepend("<%= j(render('bike_post', :bike=> ??)) %>")

_bike_post.html.erb

<tr>
<td>$<%= bike.price %>0</td>
  <% if bike.posted != nil %>
    <td><%= image_tag bike.posted, :height => '200', :width => '200' %></td>
  <% else %>
    <td><%= image_tag 'y-u-no-guy.jpg' %></td>
  <% end %>

<td><%= link_to bike.title, bike.url, :target => '_blank' %></td>
<td><%= bike.location %></td>
<td><%= bike.created_at.strftime("%b %d, %H:%M") %></td>
</tr>

我想过这样做但不知道如何实现的方法是将最新项目的最后created_at日期存储在最近呈现的数组中,然后选择在控制器中创建一个仅包含新项目的实例变量进行 ajax 调用时将使用部分。此过程还必须更新最后一个 created_at 日期。

不过,我不知道如何实现这样的东西,尤其是如何在运行控制器操作后使 last_created_at 变量持续存在

感谢您提前提供任何帮助

4

1 回答 1

1

存储页面呈现的日期。

<%= hidden_field_tag 'render_date', DateTime.now %>

在您的 ajax 调用中将其发送到服务器

var renderDate = $('#render_date').val();
var deferred = $.get(urlToUpdate, {render_date: renderDate});

然后在控制器中查询 Bikes 以获取在页面呈现后创建的那些。

bikes = Bike.where("created_at > ?", render_date)

将它们作为 JSON 发送给客户端

render json: bikes

并将它们添加到自行车列表中。

deferred.success(function(bikes){
  var list = $('.bikes-list');
  for(var i =0; i < bikes.length, i++){
    list.append('<li>' + bike.model + '</li>');
  }
});

您还需要更新客户端上的 render_date。

于 2013-07-01T18:16:30.893 回答