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

Rails 7使用Stripe时请求无法识别format.js如何解决

解决方案

问题根本原因:Rails 7 默认使用 Turbo 替代了旧版本的 Rails UJS,remote: true 发起的异步请求默认请求格式为 text/vnd.turbo-stream.html 而非 text/javascript,因此控制器无法匹配到 format.js 的响应逻辑,抛出 ActionController::UnknownFormat 错误。

以下是三种经过验证的可行方案:

方案1:最小改动适配原逻辑(保留format.js)

直接修改结账按钮的路径参数,显式指定请求格式为JS,即可触发控制器的format.js响应,其余代码无需改动:

<%= button_to 'Checkout', checkout_create_path(format: :js), method: :post, remote: true %>

方案2:适配Rails 7默认的Turbo规范

这是更符合Rails 7原生设计逻辑的方案:

  1. 修改控制器的响应逻辑:
respond_to do |format|
  format.turbo_stream
end
  1. 将原 app/views/checkout/create.js.erb 文件重命名为 app/views/checkout/create.turbo_stream.erb,文件内的JS代码无需修改即可正常运行。

方案3:无需JS的最简实现(推荐)

Stripe Checkout Session 本身提供了直接跳转的URL,完全可以跳过前端JS跳转逻辑,无需处理异步请求格式问题:

  1. 移除按钮的 remote: true 参数,改回普通同步请求:
<%= button_to 'Checkout', checkout_create_path, method: :post %>
  1. 替换控制器中的respond_to逻辑,直接重定向到Stripe结账页:
# 去掉原respond_to代码块,替换为下面的代码
redirect_to @session.url, allow_other_host: true

这个方案不需要任何前端JS处理,也不存在格式兼容问题,是最轻量的实现方式。


注意:如果选择方案1或2,你当前在application.html.erb的Stripe脚本引入配置已经满足运行要求,无需额外调整。

内容的提问来源于stack exchange,提问作者Samuel Da Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:42:02