You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用原生JavaScript的Ajax更新Rails HTML表格(无需jQuery)

无需jQuery实现Rails局部视图无刷新更新

看起来你已经搞定了数据保存的Ajax逻辑,就差最后一步更新表格啦!下面是具体的修改方案,全程用原生JS实现,不用依赖jQuery:

1. 后端修改:让save_my_play返回渲染好的表格局部视图

我们需要让控制器在保存数据后,把最新的表格HTML返回给前端。修改你的plays_controller.rb里的save_my_play方法:

def save_my_play
  # 你的现有代码(获取游戏图片、保存Play数据)...
  @game = Game.last
  array_images = Array.new()
  @game.images.each do |image|
    array_images.push(url_for(image))
  end

  countdown = params[:countdown]
  play = Play.new
  play.current_time = countdown
  play.image_url = array_images.index(array_images.sample)
  play.save

  @plays = Play.all

  # 新增:渲染_table局部视图,返回纯HTML(不带布局)
  render partial: 'table', locals: { plays: @plays }, layout: false
end

2. 前端修改:Ajax成功后替换表格内容

更新你的savegame.js.erb,在请求成功时用返回的HTML替换现有表格容器的内容,同时别忘了加上Rails要求的CSRF令牌(避免请求被拦截):

function saveMyGame() {
  var countdown = document.getElementById("countdown").innerHTML;
  // 获取页面中的CSRF令牌(Rails默认会在head里生成这个meta标签)
  var csrfToken = document.querySelector('meta[name="csrf-token"]').content;
  
  var xhr = new XMLHttpRequest();
  xhr.open('POST', '/plays/save_my_play');
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  // 把CSRF令牌加到请求头里,确保请求合法
  xhr.setRequestHeader('X-CSRF-Token', csrfToken);
  
  xhr.onload = function() {
    if (xhr.status === 200) {
      // 用返回的新表格HTML替换#plays容器里的内容
      document.getElementById('plays').innerHTML = xhr.responseText;
      alert('Play saved successfully!'); // 可选:成功提示
    } else {
      alert('Request failed. Returned status of ' + xhr.status);
    }
  };

  // 处理网络错误的情况
  xhr.onerror = function() {
    alert('Network error occurred while saving your play.');
  };
  
  xhr.send(encodeURI('countdown=' + countdown));
}

3. 优化局部视图:使用传入的变量而非直接查询数据库

修改你的_table.html.erb,把硬编码的Play.all.each改成使用控制器传入的plays变量(更符合Rails最佳实践,也更灵活),同时修正一下标签闭合错误(原来的<th>用了</td>闭合):

<table class="table">
  <thead>
    <tr>
      <th scope="col">Tick</th>
      <th scope="col">Index of image in the array</th>
    </tr>
  </thead>
  <tbody>
    <% plays.each do |play| %>
    <tr>
      <td><%= play.current_time %></td>
      <td><%= play.image_url %></td>
    </tr>
    <% end %>
  </tbody>
</table>

4. 确认路由配置

确保你的config/routes.rb里有save_my_play的POST路由:

post '/plays/save_my_play', to: 'plays#save_my_play'

这样一来,当你点击"Save play"按钮时,Ajax会把数据提交到后端保存,后端返回最新的表格HTML,前端再把旧表格替换掉,全程不需要刷新页面~

内容的提问来源于stack exchange,提问作者Bruno Lopes Bacelar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:42:37