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

Ruby on Rails新手求助:如何用简易AJAX编辑记录?点击链接无响应

解决Ruby on Rails中remote: true AJAX未触发的问题

嘿,作为RoR新手遇到这个问题很正常,我来帮你理清楚哪里出问题了~

首先你得明白:Rails的remote: true是通过**UJS(Unobtrusive JavaScript)**自动处理AJAX请求的,你不需要再手动写$.ajax绑定点击事件,这正是你当前代码的核心问题!

问题拆解

你在index.html.erb里给编辑链接加了remote: true,这一步是对的——点击这个链接时,Rails UJS会自动发送AJAX GET请求到edit_message_path,服务器处理后会返回edit.js.erb文件,并且自动执行这个文件里的JavaScript代码。

但你现在的edit.js.erb里又写了$(document).ready(function(){ $('#edititem').on('click', ...),这就完全重复了逻辑:

  • 这个JS代码是在AJAX请求成功后才加载的,此时点击事件已经触发过了,绑定根本不会生效
  • 而且remote: true已经帮你完成了AJAX请求的发送,不需要再手动绑定事件

修正方案

1. 保留index.html.erb的链接(可以优化下标识)

<td><%= link_to 'Edit', edit_message_path(message), remote: true, class: 'edit-message-link' %></td>

这里保持remote: true即可,不需要额外的事件绑定。

2. 重写edit.js.erb

直接写AJAX成功后的执行逻辑,不需要包裹ready或点击事件:

// 直接渲染部分视图到目标容器,j是escape_javascript的简写,避免JS语法错误
$('#edititem').html("<%= j render(partial: 'messages/form', locals: { message: @message }) %>");

(注意:要确保你的控制器edit动作里已经获取了@message = Message.find(params[:id]),这样partial才能拿到数据)

额外排查点

如果还是没生效,检查这几点:

  • UJS是否加载:Rails 6+用Webpacker的话,要在app/javascript/packs/application.js里导入并启动UJS:
    import Rails from "@rails/ujs";
    Rails.start();
    
  • 浏览器控制台:打开F12看有没有JS错误,比如找不到#edititem元素,或者UJS未加载的报错
  • 服务器日志:点击链接后看终端日志,是否有XHR类型的请求记录(如果是AJAX请求,日志里会标Processing by MessagesController#edit as JS)
  • 控制器响应格式:如果控制器里有respond_to块,要确保包含:js格式:
    def edit
      @message = Message.find(params[:id])
      respond_to do |format|
        format.html
        format.js # 必须有这个,不然不会返回JS模板
      end
    end
    

这样调整后,点击编辑链接应该就能触发AJAX,自动渲染你的partial到#edititem容器里啦!

内容的提问来源于stack exchange,提问作者Priya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:09