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
相关产品推荐
相关产品推荐

