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

使用rails-ujs提交远程表单时Rails.fire返回false如何解决

根因分析

rails-ujs对远程表单(带data-remote="true")的默认submit事件监听逻辑,要求触发事件是可信的原生用户交互事件,通过Rails.fire手动构造的事件不满足这个校验条件,因此会被直接拦截返回false,不会触发AJAX提交。


解决方法

方案1:触发隐藏提交按钮的点击事件(推荐,无侵入)

在表单内部添加一个隐藏的原生提交按钮,通过触发按钮的点击事件走rails-ujs的正常处理逻辑:

  1. 调整视图表单代码,新增隐藏提交按钮:
<%= form_with model: post, method: :PUT, url: post_update_url(post), local: false, html: { data: { target: "posts.form", action: "ajax:success->posts#submitSuccess" } } do |f| %>
  <%# 新增隐藏提交按钮 %>
  <button type="submit" data-posts-target="submitBtn" style="display:none;"></button>
  // Form stuff
<% end %>
  1. 调整Stimulus控制器代码,触发按钮点击:
// 新增submitBtn target
static targets = ["form", "submitBtn"]

submit() {
  this.submitBtnTarget.click()
}

submitSuccess() {
  console.log("Success!")
}

方案2:直接调用rails-ujs的远程提交方法

无需修改视图代码,直接调用rails-ujs暴露的handleRemote方法处理远程提交:

submit() {
  // 确认全局Rails对象可访问
  if (window.Rails && this.formTarget.dataset.remote === 'true') {
    Rails.handleRemote.call(this.formTarget)
  } else {
    this.formTarget.submit()
  }
}

submitSuccess() {
  console.log("Success!")
}

前置校验

如果调整后依然不生效,先确认两个点:

  • 表单渲染后的HTML确实带有data-remote="true"属性
  • Webpacker打包的Stimulus代码中可以正常访问全局window.Rails对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:04